<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html>
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title>AI医生架构</title>
    <style>
        body{
            margin: 0;
        }
        #content-info{
            width: auto;
            margin: 0 auto;
            text-align: center;
        }
        #author-info{
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        #title{
            text-overflow: ellipsis;
            white-space: nowrap;
            overflow: hidden;
            padding-top: 10px;
            margin-bottom: 2px;
            font-size: 34px;
            color: #505050;
        }
        .text{
            white-space:nowrap;
            text-overflow: ellipsis;
            display: inline-block;
            margin-right: 20px;
            margin-bottom: 2px;
            font-size: 20px;
            color: #8c8c8c;
        }
        #navBar{
            width: auto;
            height: auto;
            position: fixed;
            right:0;
            bottom: 0;
            background-color: #f0f3f4;
            overflow-y: auto;
            text-align: center;
        }
        #svg-container{
            width: 100%;
            overflow-x: scroll;
            min-width: 0px;
            margin: 0 10px;
            overflow: visible;
            position: relative;
        }
        #nav-thumbs{
            overflow-y: scroll;
            padding: 0 5px;
        }
        .nav-thumb{
            position: relative;
            margin: 10px auto;
        }
        .nav-thumb >p{
            text-align: center;
            font-size: 12px;
            margin: 4px 0 0 0;
        }
        .nav-thumb >div{
            position: relative;
            display: inline-block;
            border: 1px solid #c6cfd5;
        }
        .nav-thumb img{
            display: block;
        }
        #main-content{
            bottom: 0;
            left: 0;
            right: 0;
            background-color: #d0cfd8;
            display: flex;
            height: auto;
            flex-flow: row wrap;
            text-align:center;
        }
        #svg-container >svg{
            overflow: visible;
            display: block;
            margin:5px auto;
            margin-bottom: 5px;
        }
        #copyright{
            bottom: 0;
            left: 50%;
            margin: 5px auto;
            font-size: 16px;
            color: #515151;
        }
        #copyright >a{
            text-decoration: none;
            color: #77C;
        }
        .number{
            position: absolute;
            top:0;
            left:0;
            border-top:22px solid #08a1ef;
            border-right: 22px solid transparent;
        }
        .pagenum{
            font-size: 12px;
            color: #fff;
            position: absolute;
            top: -23px;
            left: 2px;
        }
            #navBar::-webkit-scrollbar{
            width: 8px;
            background-color: #f5f5f5;
        }
            #navBar::-webkit-scrollbar-track{
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            border-radius: 8px;
            background-color: #fff;
        }
            #navBar::-webkit-scrollbar-thumb{
            border-radius: 8px;
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            background-color: #6b6b70;
        }
        #navBar::-webkit-scrollbar-thumb:hover{
            background-color: #4a4a4f;
        }
</style>
  </head>
  <body>
    <div id="main-area">
      <div id="main-content">
        <div id="svg-container"><svg ed:hSpacing="30" xmlns="http://www.w3.org/2000/svg" width="1743" height="3613" viewBox="0 0 1743 3613" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:ed="https://www.edrawsoft.cn/xml/2017/SVGExtensions/" id="page0" preserveAspectRadio="xMinYMin meet" ed:name="页面-1" ed:vSpacing="30">
    <style type="text/css"><![CDATA[
g[ed\:togtopicid],g[ed\:hyperlink],g[ed\:comment],g[ed\:note] {cursor:pointer;}
g[id] {-moz-user-select: none;-ms-user-select: none;user-select: none;}
svg text::selection,svg tspan::selection{background-color: #4285f4;color: #ffffff;fill: #ffffff;}
.st5 {fill:#000000;font-family:微软雅黑;font-size:10pt}
.st9 {fill:#000000;font-family:微软雅黑;font-size:9pt}
.st1 {fill:#303030;font-family:微软雅黑;font-size:10pt}
.st4 {fill:#454545;font-family:微软雅黑;font-size:10pt}
.st3 {fill:#454545;font-family:微软雅黑;font-size:14pt;font-weight:bold}
.st2 {fill:#454545;font-family:微软雅黑;font-size:18pt;font-weight:bold}
.st6 {fill:#454545}
.st7 {fill:#f96628;font-family:微软雅黑;font-size:10pt}
.st8 {fill:#f96628}
]]></style>
    <defs/>
    <rect width="1743" height="3613" x="0" y="0" fill="#fbfcfb"/>
    <g ed:type="relation" transform="matrix(1,0,0,1,406.85,533.88)" id="202" ed:toid="112" ed:fromid="110">
        <path d="M0,-210.4C-104.5,-199.4,-150.5,208.3,0,210.4" fill="none"/>
        <path stroke-linecap="round" stroke-linejoin="round" d="M0,-210.4C-103.1,-199.6,-149.3,197.7,-5.8,210.1" stroke="#a98ae7" fill="none"/>
        <path stroke-linecap="round" d="M0,210.4L-6.7,206.1C-6.1,207.3,-5.8,208.7,-5.8,210.1C-5.9,211.6,-6.4,212.9,-7.1,214.1L0,210.4" stroke="#a98ae7" fill="#a98ae7" stroke-width="1"/>
        <rect width="71.33" height="18" x="-80.9" y="-14.7" fill="#fbfcfb"/>
        <rect width="111.33" height="18" x="-100.9" y="3.3" fill="#fbfcfb"/>
        <text class="st1">
            <tspan textLength="69" x="-132" style="white-space:pre" y="-1.323">Flask框架、</tspan>
            <tspan textLength="109" x="-152" style="white-space:pre" y="16.677">Gunicorn服务组件</tspan>
        </text>
    </g>
    <path stroke-linecap="round" ed:parentid="101" stroke-linejoin="round" ed:tosuperid="102" transform="matrix(1,0,0,1,170.31,841.89)" d="M-49.8,389.5C-50.4,391.2,-49.8,392.7,-48.5,393.2C-47.2,393.6,-45.7,392.9,-45.1,391.2C-44.4,388.9,-43.6,386.7,-42.9,384.4C-42.2,382.2,-41.5,379.9,-40.9,377.6C-40.3,375.4,-39.7,373.1,-39.1,370.8C-38.6,368.5,-38.1,366.2,-37.6,363.9C-37,361.6,-36.6,359.3,-36.1,357C-35.7,354.7,-35.2,352.4,-34.8,350.1C-34.4,347.8,-34,345.5,-33.6,343.2C-33.2,340.8,-32.9,338.5,-32.5,336.2C-32.2,333.9,-31.8,331.6,-31.5,329.3C-31.2,326.9,-30.9,324.6,-30.5,322.3C-30.2,320,-30,317.7,-29.7,315.3C-29.4,313,-29.1,310.7,-28.9,308.4C-28.6,306,-28.3,303.7,-28.1,301.4C-27.9,299.1,-27.6,296.7,-27.4,294.4C-27.2,292.1,-26.9,289.8,-26.7,287.4C-26.5,285.1,-26.3,282.8,-26.1,280.4C-25.9,278.1,-25.7,275.8,-25.5,273.5C-25.3,271.1,-25.1,268.8,-25,266.5C-24.8,264.1,-24.6,261.8,-24.4,259.5C-24.3,257.1,-24.1,254.8,-23.9,252.5C-23.8,250.2,-23.6,247.8,-23.5,245.5C-23.3,243.2,-23.2,240.8,-23,238.5C-22.9,236.2,-22.8,233.8,-22.6,231.5C-22.5,229.2,-22.4,226.8,-22.2,224.5C-22.1,222.2,-22,219.8,-21.9,217.5C-21.7,215.2,-21.6,212.9,-21.5,210.5C-21.4,208.2,-21.3,205.9,-21.2,203.5C-21.1,201.2,-21,198.9,-20.9,196.5C-20.7,194.2,-20.6,191.9,-20.5,189.5C-20.4,187.2,-20.3,184.9,-20.3,182.5C-20.2,180.2,-20.1,177.9,-20,175.5C-19.9,173.2,-19.8,170.9,-19.7,168.5C-19.6,166.2,-19.5,163.9,-19.4,161.5C-19.4,159.2,-19.3,156.9,-19.2,154.5C-19.1,152.2,-19,149.9,-19,147.5C-18.9,145.2,-18.8,142.9,-18.7,140.5C-18.7,138.2,-18.6,135.9,-18.5,133.5C-18.4,131.2,-18.4,128.9,-18.3,126.5C-18.2,124.2,-18.2,121.9,-18.1,119.5C-18,117.2,-18,114.9,-17.9,112.5C-17.8,110.2,-17.8,107.9,-17.7,105.5C-17.6,103.2,-17.6,100.9,-17.5,98.5C-17.4,96.2,-17.4,93.9,-17.3,91.5C-17.3,89.2,-17.2,86.9,-17.1,84.6C-17.1,82.2,-17,79.9,-17,77.6C-16.9,75.2,-16.8,72.9,-16.8,70.6C-16.7,68.2,-16.7,65.9,-16.6,63.6C-16.5,61.2,-16.5,58.9,-16.4,56.6C-16.4,54.2,-16.3,51.9,-16.2,49.6C-16.2,47.2,-16.1,44.9,-16.1,42.6C-16,40.2,-16,37.9,-15.9,35.6C-15.8,33.2,-15.8,30.9,-15.7,28.6C-15.7,26.2,-15.6,23.9,-15.5,21.6C-15.5,19.2,-15.4,16.9,-15.4,14.6C-15.3,12.2,-15.2,9.9,-15.2,7.6C-15.1,5.2,-15.1,2.9,-15,0.6C-14.9,-1.8,-14.9,-4.1,-14.8,-6.4C-14.8,-8.8,-14.7,-11.1,-14.6,-13.4C-14.6,-15.7,-14.5,-18.1,-14.4,-20.4C-14.4,-22.7,-14.3,-25.1,-14.2,-27.4C-14.2,-29.7,-14.1,-32.1,-14,-34.4C-14,-36.7,-13.9,-39.1,-13.8,-41.4C-13.7,-43.7,-13.7,-46.1,-13.6,-48.4C-13.5,-50.7,-13.5,-53.1,-13.4,-55.4C-13.3,-57.7,-13.2,-60.1,-13.2,-62.4C-13.1,-64.7,-13,-67,-12.9,-69.4C-12.8,-71.7,-12.7,-74,-12.7,-76.4C-12.6,-78.7,-12.5,-81,-12.4,-83.4C-12.3,-85.7,-12.2,-88,-12.1,-90.4C-12.1,-92.7,-12,-95,-11.9,-97.4C-11.8,-99.7,-11.7,-102,-11.6,-104.3C-11.5,-106.7,-11.4,-109,-11.3,-111.3C-11.2,-113.7,-11.1,-116,-11,-118.3C-10.9,-120.7,-10.8,-123,-10.7,-125.3C-10.5,-127.6,-10.4,-130,-10.3,-132.3C-10.2,-134.6,-10.1,-137,-10,-139.3C-9.8,-141.6,-9.7,-144,-9.6,-146.3C-9.5,-148.6,-9.3,-150.9,-9.2,-153.3C-9.1,-155.6,-9,-157.9,-8.8,-160.3C-8.7,-162.6,-8.5,-164.9,-8.4,-167.2C-8.3,-169.6,-8.1,-171.9,-8,-174.2C-7.8,-176.5,-7.7,-178.9,-7.5,-181.2C-7.3,-183.5,-7.2,-185.9,-7,-188.2C-6.9,-190.5,-6.7,-192.8,-6.5,-195.2C-6.3,-197.5,-6.2,-199.8,-6,-202.1C-5.8,-204.5,-5.6,-206.8,-5.4,-209.1C-5.2,-211.4,-5.1,-213.8,-4.9,-216.1C-4.7,-218.4,-4.5,-220.7,-4.2,-223.1C-4,-225.4,-3.8,-227.7,-3.6,-230C-3.4,-232.3,-3.2,-234.7,-2.9,-237C-2.7,-239.3,-2.5,-241.6,-2.2,-243.9C-2,-246.3,-1.7,-248.6,-1.5,-250.9C-1.2,-253.2,-1,-255.5,-0.7,-257.8C-0.4,-260.2,-0.2,-262.5,0.1,-264.8C0.4,-267.1,0.7,-269.4,1,-271.7C1.3,-274,1.6,-276.4,1.9,-278.7C2.2,-281,2.6,-283.3,2.9,-285.6C3.2,-287.9,3.6,-290.2,3.9,-292.5C4.3,-294.8,4.6,-297.1,5,-299.4C5.4,-301.7,5.8,-304,6.2,-306.3C6.6,-308.6,7,-310.9,7.4,-313.2C7.8,-315.5,8.3,-317.8,8.7,-320.1C9.2,-322.3,9.6,-324.6,10.1,-326.9C10.6,-329.2,11.1,-331.5,11.6,-333.7C12.1,-336,12.6,-338.3,13.2,-340.5C13.7,-342.8,14.3,-345.1,14.9,-347.3C15.5,-349.6,16.1,-351.8,16.7,-354C17.4,-356.3,18,-358.5,18.7,-360.7C19.4,-363,20.1,-365.2,20.9,-367.4C21.6,-369.6,22.4,-371.8,23.3,-373.9C24.1,-376.1,24.9,-378.3,25.8,-380.4C26.7,-382.6,27.7,-384.7,28.7,-386.8C29.7,-388.9,30.7,-390.9,31.9,-393C33,-395,34.1,-397,35.4,-399C36.6,-400.9,38,-402.8,39.4,-404.7C40.8,-406.5,42.3,-408.3,43.9,-409.9C45.5,-411.6,47.2,-413.1,49,-414.6C50.9,-416,52.8,-417.2,54.8,-418.3C56.8,-419.4,58.8,-420.2,61.2,-420.8C63.6,-421.4,66.5,-421.8,68,-421.9C69.5,-422.1,69.6,-422,69.8,-422C70.1,-421.9,70.4,-422.2,70.4,-422.5C70.4,-422.8,70.1,-422.9,69.8,-423C69.6,-423,69.5,-423.1,67.9,-423C66.4,-422.8,63.4,-422.5,60.9,-421.8C58.4,-421.2,56.4,-420.3,54.3,-419.2C52.3,-418.2,50.2,-416.9,48.3,-415.4C46.5,-414,44.7,-412.4,43.1,-410.7C41.4,-409,39.9,-407.2,38.4,-405.4C37,-403.5,35.6,-401.6,34.4,-399.6C33.1,-397.7,31.9,-395.6,30.8,-393.6C29.6,-391.5,28.6,-389.4,27.5,-387.3C26.5,-385.2,25.6,-383.1,24.6,-380.9C23.7,-378.8,22.8,-376.6,22,-374.4C21.2,-372.2,20.4,-370,19.6,-367.8C18.8,-365.6,18.1,-363.4,17.4,-361.2C16.7,-358.9,16,-356.7,15.4,-354.4C14.7,-352.2,14.1,-349.9,13.5,-347.7C12.9,-345.4,12.3,-343.2,11.7,-340.9C11.2,-338.6,10.6,-336.4,10.1,-334.1C9.6,-331.8,9,-329.5,8.6,-327.2C8.1,-324.9,7.6,-322.7,7.1,-320.4C6.7,-318.1,6.2,-315.8,5.8,-313.5C5.3,-311.2,4.9,-308.9,4.5,-306.6C4.1,-304.3,3.7,-302,3.3,-299.7C2.9,-297.4,2.6,-295.1,2.2,-292.8C1.8,-290.5,1.5,-288.2,1.1,-285.8C0.8,-283.5,0.5,-281.2,0.1,-278.9C-0.2,-276.6,-0.5,-274.3,-0.8,-272C-1.1,-269.7,-1.4,-267.3,-1.7,-265C-2,-262.7,-2.3,-260.4,-2.6,-258.1C-2.9,-255.7,-3.1,-253.4,-3.4,-251.1C-3.7,-248.8,-3.9,-246.5,-4.2,-244.1C-4.4,-241.8,-4.7,-239.5,-4.9,-237.2C-5.2,-234.9,-5.4,-232.5,-5.6,-230.2C-5.9,-227.9,-6.1,-225.6,-6.3,-223.2C-6.5,-220.9,-6.7,-218.6,-7,-216.3C-7.2,-213.9,-7.4,-211.6,-7.6,-209.3C-7.8,-207,-8,-204.6,-8.2,-202.3C-8.3,-200,-8.5,-197.7,-8.7,-195.3C-8.9,-193,-9.1,-190.7,-9.3,-188.3C-9.4,-186,-9.6,-183.7,-9.8,-181.4C-9.9,-179,-10.1,-176.7,-10.3,-174.4C-10.4,-172,-10.6,-169.7,-10.7,-167.4C-10.9,-165.1,-11,-162.7,-11.2,-160.4C-11.3,-158.1,-11.5,-155.7,-11.6,-153.4C-11.8,-151.1,-11.9,-148.7,-12,-146.4C-12.2,-144.1,-12.3,-141.8,-12.4,-139.4C-12.6,-137.1,-12.7,-134.8,-12.8,-132.4C-12.9,-130.1,-13.1,-127.8,-13.2,-125.4C-13.3,-123.1,-13.4,-120.8,-13.5,-118.4C-13.7,-116.1,-13.8,-113.8,-13.9,-111.5C-14,-109.1,-14.1,-106.8,-14.2,-104.5C-14.3,-102.1,-14.4,-99.8,-14.5,-97.5C-14.6,-95.1,-14.7,-92.8,-14.8,-90.5C-14.9,-88.1,-15,-85.8,-15.1,-83.5C-15.2,-81.1,-15.3,-78.8,-15.4,-76.5C-15.5,-74.1,-15.6,-71.8,-15.7,-69.5C-15.8,-67.2,-15.9,-64.8,-16,-62.5C-16.1,-60.2,-16.2,-57.8,-16.2,-55.5C-16.3,-53.2,-16.4,-50.8,-16.5,-48.5C-16.6,-46.2,-16.7,-43.8,-16.8,-41.5C-16.8,-39.2,-16.9,-36.8,-17,-34.5C-17.1,-32.2,-17.2,-29.8,-17.2,-27.5C-17.3,-25.2,-17.4,-22.8,-17.5,-20.5C-17.5,-18.2,-17.6,-15.8,-17.7,-13.5C-17.8,-11.2,-17.8,-8.8,-17.9,-6.5C-18,-4.2,-18.1,-1.8,-18.1,0.5C-18.2,2.8,-18.3,5.2,-18.4,7.5C-18.4,9.8,-18.5,12.1,-18.6,14.5C-18.6,16.8,-18.7,19.1,-18.8,21.5C-18.9,23.8,-18.9,26.1,-19,28.5C-19.1,30.8,-19.1,33.1,-19.2,35.5C-19.3,37.8,-19.3,40.1,-19.4,42.5C-19.5,44.8,-19.5,47.1,-19.6,49.5C-19.7,51.8,-19.8,54.1,-19.8,56.5C-19.9,58.8,-20,61.1,-20,63.5C-20.1,65.8,-20.2,68.1,-20.2,70.5C-20.3,72.8,-20.4,75.1,-20.5,77.5C-20.5,79.8,-20.6,82.1,-20.7,84.5C-20.7,86.8,-20.8,89.1,-20.9,91.4C-21,93.8,-21,96.1,-21.1,98.4C-21.2,100.8,-21.3,103.1,-21.3,105.4C-21.4,107.8,-21.5,110.1,-21.6,112.4C-21.6,114.8,-21.7,117.1,-21.8,119.4C-21.9,121.8,-22,124.1,-22,126.4C-22.1,128.8,-22.2,131.1,-22.3,133.4C-22.4,135.7,-22.5,138.1,-22.5,140.4C-22.6,142.7,-22.7,145.1,-22.8,147.4C-22.9,149.7,-23,152.1,-23.1,154.4C-23.2,156.7,-23.3,159.1,-23.3,161.4C-23.4,163.7,-23.5,166,-23.6,168.4C-23.7,170.7,-23.8,173,-23.9,175.4C-24,177.7,-24.1,180,-24.3,182.4C-24.4,184.7,-24.5,187,-24.6,189.3C-24.7,191.7,-24.8,194,-24.9,196.3C-25,198.7,-25.1,201,-25.3,203.3C-25.4,205.6,-25.5,208,-25.6,210.3C-25.8,212.6,-25.9,215,-26,217.3C-26.2,219.6,-26.3,221.9,-26.4,224.3C-26.6,226.6,-26.7,228.9,-26.9,231.3C-27,233.6,-27.2,235.9,-27.3,238.2C-27.5,240.6,-27.6,242.9,-27.8,245.2C-27.9,247.5,-28.1,249.9,-28.3,252.2C-28.4,254.5,-28.6,256.8,-28.8,259.2C-29,261.5,-29.2,263.8,-29.3,266.1C-29.5,268.4,-29.7,270.8,-29.9,273.1C-30.1,275.4,-30.3,277.7,-30.5,280C-30.8,282.4,-31,284.7,-31.2,287C-31.4,289.3,-31.7,291.6,-31.9,294C-32.1,296.3,-32.4,298.6,-32.6,300.9C-32.9,303.2,-33.2,305.5,-33.4,307.8C-33.7,310.2,-34,312.5,-34.3,314.8C-34.6,317.1,-34.9,319.4,-35.2,321.7C-35.5,324,-35.8,326.3,-36.1,328.6C-36.5,330.9,-36.8,333.2,-37.2,335.5C-37.5,337.8,-37.9,340.1,-38.3,342.4C-38.7,344.7,-39.1,346.9,-39.5,349.2C-40,351.5,-40.4,353.8,-40.9,356.1C-41.3,358.3,-41.8,360.6,-42.3,362.9C-42.8,365.1,-43.3,367.4,-43.9,369.6C-44.5,371.9,-45,374.1,-45.7,376.3C-46.3,378.5,-46.9,380.8,-47.6,383C-48.3,385.1,-49.1,387.3,-49.8,389.5z" id="103" stroke="#ff7575" fill="#ff7575"/>
    <path stroke-linecap="round" ed:parentid="101" stroke-linejoin="round" ed:tosuperid="104" transform="matrix(1,0,0,1,170.31,1686.88)" d="M-45.1,-391.2C-45.7,-392.9,-47.2,-393.6,-48.5,-393.2C-49.8,-392.7,-50.4,-391.2,-49.8,-389.5C-49.1,-387.3,-48.3,-385.1,-47.6,-383C-46.9,-380.8,-46.3,-378.5,-45.7,-376.3C-45,-374.1,-44.5,-371.9,-43.9,-369.6C-43.3,-367.4,-42.8,-365.1,-42.3,-362.9C-41.8,-360.6,-41.3,-358.3,-40.9,-356.1C-40.4,-353.8,-40,-351.5,-39.5,-349.2C-39.1,-346.9,-38.7,-344.7,-38.3,-342.4C-37.9,-340.1,-37.5,-337.8,-37.2,-335.5C-36.8,-333.2,-36.5,-330.9,-36.1,-328.6C-35.8,-326.3,-35.5,-324,-35.2,-321.7C-34.9,-319.4,-34.6,-317.1,-34.3,-314.8C-34,-312.5,-33.7,-310.2,-33.4,-307.8C-33.2,-305.5,-32.9,-303.2,-32.6,-300.9C-32.4,-298.6,-32.1,-296.3,-31.9,-294C-31.7,-291.6,-31.4,-289.3,-31.2,-287C-31,-284.7,-30.8,-282.4,-30.5,-280C-30.3,-277.7,-30.1,-275.4,-29.9,-273.1C-29.7,-270.8,-29.5,-268.4,-29.3,-266.1C-29.2,-263.8,-29,-261.5,-28.8,-259.2C-28.6,-256.8,-28.4,-254.5,-28.3,-252.2C-28.1,-249.9,-27.9,-247.5,-27.8,-245.2C-27.6,-242.9,-27.5,-240.6,-27.3,-238.2C-27.2,-235.9,-27,-233.6,-26.9,-231.3C-26.7,-228.9,-26.6,-226.6,-26.4,-224.3C-26.3,-221.9,-26.2,-219.6,-26,-217.3C-25.9,-215,-25.8,-212.6,-25.6,-210.3C-25.5,-208,-25.4,-205.6,-25.3,-203.3C-25.1,-201,-25,-198.7,-24.9,-196.3C-24.8,-194,-24.7,-191.7,-24.6,-189.3C-24.5,-187,-24.4,-184.7,-24.3,-182.4C-24.1,-180,-24,-177.7,-23.9,-175.4C-23.8,-173,-23.7,-170.7,-23.6,-168.4C-23.5,-166,-23.4,-163.7,-23.3,-161.4C-23.3,-159.1,-23.2,-156.7,-23.1,-154.4C-23,-152.1,-22.9,-149.7,-22.8,-147.4C-22.7,-145.1,-22.6,-142.7,-22.5,-140.4C-22.5,-138.1,-22.4,-135.7,-22.3,-133.4C-22.2,-131.1,-22.1,-128.8,-22,-126.4C-22,-124.1,-21.9,-121.8,-21.8,-119.4C-21.7,-117.1,-21.6,-114.8,-21.6,-112.4C-21.5,-110.1,-21.4,-107.8,-21.3,-105.4C-21.3,-103.1,-21.2,-100.8,-21.1,-98.4C-21,-96.1,-21,-93.8,-20.9,-91.4C-20.8,-89.1,-20.7,-86.8,-20.7,-84.5C-20.6,-82.1,-20.5,-79.8,-20.5,-77.5C-20.4,-75.1,-20.3,-72.8,-20.2,-70.5C-20.2,-68.1,-20.1,-65.8,-20,-63.5C-20,-61.1,-19.9,-58.8,-19.8,-56.5C-19.8,-54.1,-19.7,-51.8,-19.6,-49.5C-19.5,-47.1,-19.5,-44.8,-19.4,-42.5C-19.3,-40.1,-19.3,-37.8,-19.2,-35.5C-19.1,-33.1,-19.1,-30.8,-19,-28.5C-18.9,-26.1,-18.9,-23.8,-18.8,-21.5C-18.7,-19.1,-18.6,-16.8,-18.6,-14.5C-18.5,-12.1,-18.4,-9.8,-18.4,-7.5C-18.3,-5.2,-18.2,-2.8,-18.1,-0.5C-18.1,1.8,-18,4.2,-17.9,6.5C-17.8,8.8,-17.8,11.2,-17.7,13.5C-17.6,15.8,-17.5,18.2,-17.5,20.5C-17.4,22.8,-17.3,25.2,-17.2,27.5C-17.2,29.8,-17.1,32.2,-17,34.5C-16.9,36.8,-16.8,39.2,-16.8,41.5C-16.7,43.8,-16.6,46.2,-16.5,48.5C-16.4,50.8,-16.3,53.2,-16.2,55.5C-16.2,57.8,-16.1,60.2,-16,62.5C-15.9,64.8,-15.8,67.2,-15.7,69.5C-15.6,71.8,-15.5,74.1,-15.4,76.5C-15.3,78.8,-15.2,81.1,-15.1,83.5C-15,85.8,-14.9,88.1,-14.8,90.5C-14.7,92.8,-14.6,95.1,-14.5,97.5C-14.4,99.8,-14.3,102.1,-14.2,104.5C-14.1,106.8,-14,109.1,-13.9,111.5C-13.8,113.8,-13.7,116.1,-13.5,118.4C-13.4,120.8,-13.3,123.1,-13.2,125.4C-13.1,127.8,-12.9,130.1,-12.8,132.4C-12.7,134.8,-12.6,137.1,-12.4,139.4C-12.3,141.8,-12.2,144.1,-12,146.4C-11.9,148.7,-11.8,151.1,-11.6,153.4C-11.5,155.7,-11.3,158.1,-11.2,160.4C-11,162.7,-10.9,165.1,-10.7,167.4C-10.6,169.7,-10.4,172,-10.3,174.4C-10.1,176.7,-9.9,179,-9.8,181.4C-9.6,183.7,-9.4,186,-9.3,188.3C-9.1,190.7,-8.9,193,-8.7,195.3C-8.5,197.7,-8.3,200,-8.2,202.3C-8,204.6,-7.8,207,-7.6,209.3C-7.4,211.6,-7.2,213.9,-7,216.3C-6.7,218.6,-6.5,220.9,-6.3,223.2C-6.1,225.6,-5.9,227.9,-5.6,230.2C-5.4,232.5,-5.2,234.9,-4.9,237.2C-4.7,239.5,-4.4,241.8,-4.2,244.1C-3.9,246.5,-3.7,248.8,-3.4,251.1C-3.1,253.4,-2.9,255.7,-2.6,258.1C-2.3,260.4,-2,262.7,-1.7,265C-1.4,267.3,-1.1,269.7,-0.8,272C-0.5,274.3,-0.2,276.6,0.1,278.9C0.5,281.2,0.8,283.5,1.1,285.8C1.5,288.2,1.8,290.5,2.2,292.8C2.6,295.1,2.9,297.4,3.3,299.7C3.7,302,4.1,304.3,4.5,306.6C4.9,308.9,5.3,311.2,5.8,313.5C6.2,315.8,6.7,318.1,7.1,320.4C7.6,322.7,8.1,324.9,8.6,327.2C9,329.5,9.6,331.8,10.1,334.1C10.6,336.4,11.2,338.6,11.7,340.9C12.3,343.2,12.9,345.4,13.5,347.7C14.1,349.9,14.7,352.2,15.4,354.4C16,356.7,16.7,358.9,17.4,361.2C18.1,363.4,18.8,365.6,19.6,367.8C20.4,370,21.2,372.2,22,374.4C22.8,376.6,23.7,378.8,24.6,380.9C25.6,383.1,26.5,385.2,27.5,387.3C28.6,389.4,29.6,391.5,30.8,393.6C31.9,395.6,33.1,397.7,34.4,399.6C35.6,401.6,37,403.5,38.4,405.4C39.9,407.2,41.4,409,43.1,410.7C44.7,412.4,46.5,414,48.3,415.4C50.2,416.9,52.3,418.2,54.3,419.2C56.4,420.3,58.4,421.2,60.9,421.8C63.4,422.5,66.4,422.8,67.9,423C69.5,423.1,69.6,423,69.8,423C70.1,422.9,70.4,422.8,70.4,422.5C70.4,422.2,70.1,421.9,69.8,422C69.6,422,69.5,422.1,68,421.9C66.5,421.8,63.6,421.4,61.2,420.8C58.8,420.2,56.8,419.4,54.8,418.3C52.8,417.2,50.9,416,49,414.6C47.2,413.1,45.5,411.6,43.9,409.9C42.3,408.3,40.8,406.5,39.4,404.7C38,402.8,36.6,400.9,35.4,399C34.1,397,33,395,31.9,393C30.7,390.9,29.7,388.9,28.7,386.8C27.7,384.7,26.7,382.6,25.8,380.4C24.9,378.3,24.1,376.1,23.3,373.9C22.4,371.8,21.6,369.6,20.9,367.4C20.1,365.2,19.4,363,18.7,360.7C18,358.5,17.4,356.3,16.7,354C16.1,351.8,15.5,349.6,14.9,347.3C14.3,345.1,13.7,342.8,13.2,340.5C12.6,338.3,12.1,336,11.6,333.7C11.1,331.5,10.6,329.2,10.1,326.9C9.6,324.6,9.2,322.3,8.7,320.1C8.3,317.8,7.8,315.5,7.4,313.2C7,310.9,6.6,308.6,6.2,306.3C5.8,304,5.4,301.7,5,299.4C4.6,297.1,4.3,294.8,3.9,292.5C3.6,290.2,3.2,287.9,2.9,285.6C2.6,283.3,2.2,281,1.9,278.7C1.6,276.4,1.3,274,1,271.7C0.7,269.4,0.4,267.1,0.1,264.8C-0.2,262.5,-0.4,260.2,-0.7,257.8C-1,255.5,-1.2,253.2,-1.5,250.9C-1.7,248.6,-2,246.3,-2.2,243.9C-2.5,241.6,-2.7,239.3,-2.9,237C-3.2,234.7,-3.4,232.3,-3.6,230C-3.8,227.7,-4,225.4,-4.2,223.1C-4.5,220.7,-4.7,218.4,-4.9,216.1C-5.1,213.8,-5.2,211.4,-5.4,209.1C-5.6,206.8,-5.8,204.5,-6,202.1C-6.2,199.8,-6.3,197.5,-6.5,195.2C-6.7,192.8,-6.9,190.5,-7,188.2C-7.2,185.9,-7.3,183.5,-7.5,181.2C-7.7,178.9,-7.8,176.5,-8,174.2C-8.1,171.9,-8.3,169.6,-8.4,167.2C-8.5,164.9,-8.7,162.6,-8.8,160.3C-9,157.9,-9.1,155.6,-9.2,153.3C-9.3,150.9,-9.5,148.6,-9.6,146.3C-9.7,144,-9.8,141.6,-10,139.3C-10.1,137,-10.2,134.6,-10.3,132.3C-10.4,130,-10.5,127.6,-10.7,125.3C-10.8,123,-10.9,120.7,-11,118.3C-11.1,116,-11.2,113.7,-11.3,111.3C-11.4,109,-11.5,106.7,-11.6,104.3C-11.7,102,-11.8,99.7,-11.9,97.4C-12,95,-12.1,92.7,-12.1,90.4C-12.2,88,-12.3,85.7,-12.4,83.4C-12.5,81,-12.6,78.7,-12.7,76.4C-12.7,74,-12.8,71.7,-12.9,69.4C-13,67,-13.1,64.7,-13.2,62.4C-13.2,60.1,-13.3,57.7,-13.4,55.4C-13.5,53.1,-13.5,50.7,-13.6,48.4C-13.7,46.1,-13.7,43.7,-13.8,41.4C-13.9,39.1,-14,36.7,-14,34.4C-14.1,32.1,-14.2,29.7,-14.2,27.4C-14.3,25.1,-14.4,22.7,-14.4,20.4C-14.5,18.1,-14.6,15.7,-14.6,13.4C-14.7,11.1,-14.8,8.8,-14.8,6.4C-14.9,4.1,-14.9,1.8,-15,-0.6C-15.1,-2.9,-15.1,-5.2,-15.2,-7.6C-15.2,-9.9,-15.3,-12.2,-15.4,-14.6C-15.4,-16.9,-15.5,-19.2,-15.5,-21.6C-15.6,-23.9,-15.7,-26.2,-15.7,-28.6C-15.8,-30.9,-15.8,-33.2,-15.9,-35.6C-16,-37.9,-16,-40.2,-16.1,-42.6C-16.1,-44.9,-16.2,-47.2,-16.2,-49.6C-16.3,-51.9,-16.4,-54.2,-16.4,-56.6C-16.5,-58.9,-16.5,-61.2,-16.6,-63.6C-16.7,-65.9,-16.7,-68.2,-16.8,-70.6C-16.8,-72.9,-16.9,-75.2,-17,-77.6C-17,-79.9,-17.1,-82.2,-17.1,-84.6C-17.2,-86.9,-17.3,-89.2,-17.3,-91.5C-17.4,-93.9,-17.4,-96.2,-17.5,-98.5C-17.6,-100.9,-17.6,-103.2,-17.7,-105.5C-17.8,-107.9,-17.8,-110.2,-17.9,-112.5C-18,-114.9,-18,-117.2,-18.1,-119.5C-18.2,-121.9,-18.2,-124.2,-18.3,-126.5C-18.4,-128.9,-18.4,-131.2,-18.5,-133.5C-18.6,-135.9,-18.7,-138.2,-18.7,-140.5C-18.8,-142.9,-18.9,-145.2,-19,-147.5C-19,-149.9,-19.1,-152.2,-19.2,-154.5C-19.3,-156.9,-19.4,-159.2,-19.4,-161.5C-19.5,-163.9,-19.6,-166.2,-19.7,-168.5C-19.8,-170.9,-19.9,-173.2,-20,-175.5C-20.1,-177.9,-20.2,-180.2,-20.3,-182.5C-20.3,-184.9,-20.4,-187.2,-20.5,-189.5C-20.6,-191.9,-20.7,-194.2,-20.9,-196.5C-21,-198.9,-21.1,-201.2,-21.2,-203.5C-21.3,-205.9,-21.4,-208.2,-21.5,-210.5C-21.6,-212.9,-21.7,-215.2,-21.9,-217.5C-22,-219.8,-22.1,-222.2,-22.2,-224.5C-22.4,-226.8,-22.5,-229.2,-22.6,-231.5C-22.8,-233.8,-22.9,-236.2,-23,-238.5C-23.2,-240.8,-23.3,-243.2,-23.5,-245.5C-23.6,-247.8,-23.8,-250.2,-23.9,-252.5C-24.1,-254.8,-24.3,-257.1,-24.4,-259.5C-24.6,-261.8,-24.8,-264.1,-25,-266.5C-25.1,-268.8,-25.3,-271.1,-25.5,-273.5C-25.7,-275.8,-25.9,-278.1,-26.1,-280.4C-26.3,-282.8,-26.5,-285.1,-26.7,-287.4C-26.9,-289.8,-27.2,-292.1,-27.4,-294.4C-27.6,-296.7,-27.9,-299.1,-28.1,-301.4C-28.3,-303.7,-28.6,-306,-28.9,-308.4C-29.1,-310.7,-29.4,-313,-29.7,-315.3C-30,-317.7,-30.2,-320,-30.5,-322.3C-30.9,-324.6,-31.2,-326.9,-31.5,-329.3C-31.8,-331.6,-32.2,-333.9,-32.5,-336.2C-32.9,-338.5,-33.2,-340.8,-33.6,-343.2C-34,-345.5,-34.4,-347.8,-34.8,-350.1C-35.2,-352.4,-35.7,-354.7,-36.1,-357C-36.6,-359.3,-37,-361.6,-37.6,-363.9C-38.1,-366.2,-38.6,-368.5,-39.1,-370.8C-39.7,-373.1,-40.3,-375.4,-40.9,-377.6C-41.5,-379.9,-42.2,-382.2,-42.9,-384.4C-43.6,-386.7,-44.4,-388.9,-45.1,-391.2z" id="105" stroke="#5fb7f1" fill="#5fb7f1"/>
    <path stroke-linecap="round" ed:parentid="102" stroke-linejoin="round" ed:tosuperid="108" transform="matrix(1,0,0,1,389.3,250.48)" d="M-17.5,168.9C7,168.9,-17.5,-168.9,17.5,-168.9" id="109" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="102" stroke-linejoin="round" ed:tosuperid="110" transform="matrix(1,0,0,1,389.3,374.09)" d="M-17.5,45.3C5.4,45.3,-13.8,-45.3,17.5,-45.3" id="111" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="102" stroke-linejoin="round" ed:tosuperid="112" transform="matrix(1,0,0,1,389.3,588.3)" d="M-17.5,-168.9C7,-168.9,-17.5,168.9,17.5,168.9" id="113" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="305" stroke-linejoin="round" ed:tosuperid="114" transform="matrix(1,0,0,1,628.83,210.13)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="115" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="305" stroke-linejoin="round" ed:tosuperid="116" transform="matrix(1,0,0,1,628.83,225.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="117" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="305" stroke-linejoin="round" ed:tosuperid="118" transform="matrix(1,0,0,1,628.83,240.38)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="119" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="104" stroke-linejoin="round" ed:tosuperid="120" transform="matrix(1,0,0,1,389.3,1745.03)" d="M-17.5,364.3C7,364.3,-17.5,-364.3,17.5,-364.3" id="121" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="104" stroke-linejoin="round" ed:tosuperid="132" transform="matrix(1,0,0,1,389.3,1891.91)" d="M-17.5,217.5C7,217.5,-17.5,-217.5,17.5,-217.5" id="133" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="114" stroke-linejoin="round" ed:tosuperid="207" transform="matrix(1,0,0,1,801.93,195)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="208" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="118" stroke-linejoin="round" ed:tosuperid="209" transform="matrix(1,0,0,1,793.93,255.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="210" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="116" stroke-linejoin="round" ed:tosuperid="211" transform="matrix(1,0,0,1,799.93,225.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="212" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="293" stroke-linejoin="round" ed:tosuperid="289" transform="matrix(1,0,0,1,629.5,43.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="290" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="321" stroke-linejoin="round" ed:tosuperid="291" transform="matrix(1,0,0,1,655.5,601.56)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="292" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="108" stroke-linejoin="round" ed:tosuperid="293" transform="matrix(1,0,0,1,549.73,62.66)" d="M-17.5,18.9C0.8,18.9,-3.1,-18.9,17.5,-18.9" id="294" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="108" stroke-linejoin="round" ed:tosuperid="295" transform="matrix(1,0,0,1,549.73,100.47)" d="M-17.5,-18.9C0.8,-18.9,-3.1,18.9,17.5,18.9" id="296" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="295" stroke-linejoin="round" ed:tosuperid="297" transform="matrix(1,0,0,1,656.16,96.69)" d="M-17.5,22.7C1.6,22.7,-4.9,-22.7,17.5,-22.7" id="298" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="295" stroke-linejoin="round" ed:tosuperid="299" transform="matrix(1,0,0,1,656.16,111.81)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="300" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="295" stroke-linejoin="round" ed:tosuperid="301" transform="matrix(1,0,0,1,656.16,126.94)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="302" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="295" stroke-linejoin="round" ed:tosuperid="303" transform="matrix(1,0,0,1,656.16,142.06)" d="M-17.5,-22.7C1.6,-22.7,-4.9,22.7,17.5,22.7" id="304" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="110" stroke-linejoin="round" ed:tosuperid="305" transform="matrix(1,0,0,1,549.06,277.02)" d="M-17.5,51.8C6.1,51.8,-15.5,-51.8,17.5,-51.8" id="306" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="110" stroke-linejoin="round" ed:tosuperid="307" transform="matrix(1,0,0,1,549.06,380.55)" d="M-17.5,-51.8C6.1,-51.8,-15.5,51.8,17.5,51.8" id="308" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="309" transform="matrix(1,0,0,1,655.5,366.59)" d="M-17.5,65.7C7,65.7,-17.4,-65.7,17.5,-65.7" id="310" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="311" transform="matrix(1,0,0,1,655.5,398.28)" d="M-17.5,34C3.8,34,-9.9,-34,17.5,-34" id="312" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="313" transform="matrix(1,0,0,1,655.5,428.53)" d="M-17.5,3.8C-2.6,3.8,4.9,-3.8,17.5,-3.8" id="314" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="315" transform="matrix(1,0,0,1,655.5,467.78)" d="M-17.5,-35.5C4,-35.5,-10.5,35.5,17.5,35.5" id="316" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="317" transform="matrix(1,0,0,1,655.5,482.91)" d="M-17.5,-50.6C6,-50.6,-15.2,50.6,17.5,50.6" id="318" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="307" stroke-linejoin="round" ed:tosuperid="319" transform="matrix(1,0,0,1,655.5,498.03)" d="M-17.5,-65.7C7,-65.7,-17.4,65.7,17.5,65.7" id="320" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="112" stroke-linejoin="round" ed:tosuperid="321" transform="matrix(1,0,0,1,575.73,683.17)" d="M-17.5,74C7,74,-17.5,-74,17.5,-74" id="322" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="112" stroke-linejoin="round" ed:tosuperid="323" transform="matrix(1,0,0,1,575.73,831.27)" d="M-17.5,-74C7,-74,-17.5,74,17.5,74" id="324" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="323" stroke-linejoin="round" ed:tosuperid="325" transform="matrix(1,0,0,1,682.16,795.03)" d="M-17.5,110.3C7,110.3,-17.5,-110.3,17.5,-110.3" id="326" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="323" stroke-linejoin="round" ed:tosuperid="327" transform="matrix(1,0,0,1,682.16,834.28)" d="M-17.5,71C7,71,-17.5,-71,17.5,-71" id="328" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="323" stroke-linejoin="round" ed:tosuperid="329" transform="matrix(1,0,0,1,682.16,858.41)" d="M-17.5,46.9C5.6,46.9,-14.3,-46.9,17.5,-46.9" id="330" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="323" stroke-linejoin="round" ed:tosuperid="331" transform="matrix(1,0,0,1,682.16,930.25)" d="M-17.5,-24.9C2.1,-24.9,-6,24.9,17.5,24.9" id="332" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="323" stroke-linejoin="round" ed:tosuperid="333" transform="matrix(1,0,0,1,682.16,1015.59)" d="M-17.5,-110.3C7,-110.3,-17.5,110.3,17.5,110.3" id="334" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="132" stroke-linejoin="round" ed:tosuperid="335" transform="matrix(1,0,0,1,540.4,1599.41)" d="M-17.5,75C7,75,-17.5,-75,17.5,-75" id="336" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="335" stroke-linejoin="round" ed:tosuperid="339" transform="matrix(1,0,0,1,620.16,1524.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="340" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="132" stroke-linejoin="round" ed:tosuperid="341" transform="matrix(1,0,0,1,540.4,1622.1)" d="M-17.5,52.4C6.2,52.4,-15.6,-52.4,17.5,-52.4" id="342" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="341" stroke-linejoin="round" ed:tosuperid="343" transform="matrix(1,0,0,1,646.83,1562.19)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="344" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="341" stroke-linejoin="round" ed:tosuperid="345" transform="matrix(1,0,0,1,646.83,1577.31)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="346" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="363" stroke-linejoin="round" ed:tosuperid="347" transform="matrix(1,0,0,1,620.16,1719.83)" d="M-17.5,104.7C7,104.7,-17.5,-104.7,17.5,-104.7" id="348" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="347" stroke-linejoin="round" ed:tosuperid="349" transform="matrix(1,0,0,1,739.93,1615.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="350" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="363" stroke-linejoin="round" ed:tosuperid="351" transform="matrix(1,0,0,1,620.16,1743.95)" d="M-17.5,80.6C7,80.6,-17.5,-80.6,17.5,-80.6" id="352" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="351" stroke-linejoin="round" ed:tosuperid="353" transform="matrix(1,0,0,1,823.93,1663.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="354" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="363" stroke-linejoin="round" ed:tosuperid="355" transform="matrix(1,0,0,1,620.16,1774.2)" d="M-17.5,50.3C6,50.3,-15.2,-50.3,17.5,-50.3" id="356" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="355" stroke-linejoin="round" ed:tosuperid="357" transform="matrix(1,0,0,1,773.93,1708.75)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="358" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="355" stroke-linejoin="round" ed:tosuperid="359" transform="matrix(1,0,0,1,773.93,1723.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="360" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="355" stroke-linejoin="round" ed:tosuperid="361" transform="matrix(1,0,0,1,773.93,1739)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="362" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="132" stroke-linejoin="round" ed:tosuperid="363" transform="matrix(1,0,0,1,540.4,1749.49)" d="M-17.5,-75C7,-75,-17.5,75,17.5,75" id="364" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="363" stroke-linejoin="round" ed:tosuperid="365" transform="matrix(1,0,0,1,620.16,1849.83)" d="M-17.5,-25.3C2.1,-25.3,-6.2,25.3,17.5,25.3" id="366" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="367" transform="matrix(1,0,0,1,726.6,1829.75)" d="M-17.5,45.4C5.4,45.4,-13.9,-45.4,17.5,-45.4" id="368" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="369" transform="matrix(1,0,0,1,726.6,1844.88)" d="M-17.5,30.3C3.1,30.3,-8.4,-30.3,17.5,-30.3" id="370" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="371" transform="matrix(1,0,0,1,726.6,1867.56)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="372" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="373" transform="matrix(1,0,0,1,726.6,1890.25)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="374" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="375" transform="matrix(1,0,0,1,726.6,1905.38)" d="M-17.5,-30.3C3.1,-30.3,-8.4,30.3,17.5,30.3" id="376" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="365" stroke-linejoin="round" ed:tosuperid="377" transform="matrix(1,0,0,1,726.6,1920.5)" d="M-17.5,-45.4C5.4,-45.4,-13.9,45.4,17.5,45.4" id="378" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="367" stroke-linejoin="round" ed:tosuperid="379" transform="matrix(1,0,0,1,924.36,1784.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="380" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="369" stroke-linejoin="round" ed:tosuperid="381" transform="matrix(1,0,0,1,897.7,1814.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="382" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="371" stroke-linejoin="round" ed:tosuperid="387" transform="matrix(1,0,0,1,897.7,1852.44)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="388" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="371" stroke-linejoin="round" ed:tosuperid="389" transform="matrix(1,0,0,1,897.7,1867.56)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="390" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="377" stroke-linejoin="round" ed:tosuperid="391" transform="matrix(1,0,0,1,844.36,1965.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="392" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="363" stroke-linejoin="round" ed:tosuperid="393" transform="matrix(1,0,0,1,620.16,1929.23)" d="M-17.5,-104.7C7,-104.7,-17.5,104.7,17.5,104.7" id="394" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="393" stroke-linejoin="round" ed:tosuperid="395" transform="matrix(1,0,0,1,737.26,2022.59)" d="M-17.5,11.3C-0.9,11.3,0.9,-11.3,17.5,-11.3" id="396" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="393" stroke-linejoin="round" ed:tosuperid="397" transform="matrix(1,0,0,1,737.26,2045.28)" d="M-17.5,-11.3C-0.9,-11.3,0.9,11.3,17.5,11.3" id="398" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="395" stroke-linejoin="round" ed:tosuperid="399" transform="matrix(1,0,0,1,843.7,2003.69)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="400" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="395" stroke-linejoin="round" ed:tosuperid="401" transform="matrix(1,0,0,1,843.7,2018.81)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="402" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="399" stroke-linejoin="round" ed:tosuperid="403" transform="matrix(1,0,0,1,1027.46,1996.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="404" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="401" stroke-linejoin="round" ed:tosuperid="405" transform="matrix(1,0,0,1,1036.13,2026.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="406" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="397" stroke-linejoin="round" ed:tosuperid="407" transform="matrix(1,0,0,1,870.36,2056.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="408" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="301" stroke-linejoin="round" ed:tosuperid="409" transform="matrix(1,0,0,1,869.93,134.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="410" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="309" stroke-linejoin="round" ed:tosuperid="411" transform="matrix(1,0,0,1,828.6,293.31)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="412" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="309" stroke-linejoin="round" ed:tosuperid="413" transform="matrix(1,0,0,1,828.6,308.44)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="414" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="311" stroke-linejoin="round" ed:tosuperid="415" transform="matrix(1,0,0,1,877.26,364.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="416" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="313" stroke-linejoin="round" ed:tosuperid="417" transform="matrix(1,0,0,1,828.6,424.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="418" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="417" stroke-linejoin="round" ed:tosuperid="419" transform="matrix(1,0,0,1,974.36,409.63)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="420" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="417" stroke-linejoin="round" ed:tosuperid="421" transform="matrix(1,0,0,1,974.36,424.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="422" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="417" stroke-linejoin="round" ed:tosuperid="423" transform="matrix(1,0,0,1,974.36,439.88)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="424" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="315" stroke-linejoin="round" ed:tosuperid="426" transform="matrix(1,0,0,1,828.6,503.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="427" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="319" stroke-linejoin="round" ed:tosuperid="428" transform="matrix(1,0,0,1,815.26,563.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="429" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="325" stroke-linejoin="round" ed:tosuperid="430" transform="matrix(1,0,0,1,801.93,684.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="431" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="327" stroke-linejoin="round" ed:tosuperid="432" transform="matrix(1,0,0,1,885.93,763.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="433" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="329" stroke-linejoin="round" ed:tosuperid="434" transform="matrix(1,0,0,1,844.6,811.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="435" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="434" stroke-linejoin="round" ed:tosuperid="436" transform="matrix(1,0,0,1,1026.36,803.94)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="437" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="434" stroke-linejoin="round" ed:tosuperid="438" transform="matrix(1,0,0,1,1026.36,819.06)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="439" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="444" stroke-linejoin="round" ed:tosuperid="440" transform="matrix(1,0,0,1,999.7,864.44)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="441" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="444" stroke-linejoin="round" ed:tosuperid="442" transform="matrix(1,0,0,1,999.7,879.56)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="443" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="444" transform="matrix(1,0,0,1,815.26,913.59)" d="M-17.5,41.6C4.9,41.6,-12.7,-41.6,17.5,-41.6" id="445" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="446" transform="matrix(1,0,0,1,815.26,936.28)" d="M-17.5,18.9C0.8,18.9,-3.1,-18.9,17.5,-18.9" id="447" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="448" transform="matrix(1,0,0,1,815.26,951.41)" d="M-17.5,3.8C-2.6,3.8,4.9,-3.8,17.5,-3.8" id="449" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="450" transform="matrix(1,0,0,1,815.26,966.53)" d="M-17.5,-11.3C-0.9,-11.3,0.9,11.3,17.5,11.3" id="451" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="452" transform="matrix(1,0,0,1,815.26,981.66)" d="M-17.5,-26.5C2.4,-26.5,-6.7,26.5,17.5,26.5" id="453" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="331" stroke-linejoin="round" ed:tosuperid="454" transform="matrix(1,0,0,1,815.26,996.78)" d="M-17.5,-41.6C4.9,-41.6,-12.7,41.6,17.5,41.6" id="455" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="446" stroke-linejoin="round" ed:tosuperid="456" transform="matrix(1,0,0,1,986.36,917.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="457" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="448" stroke-linejoin="round" ed:tosuperid="458" transform="matrix(1,0,0,1,986.36,947.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="459" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="454" stroke-linejoin="round" ed:tosuperid="460" transform="matrix(1,0,0,1,933.03,1038.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="461" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="333" stroke-linejoin="round" ed:tosuperid="462" transform="matrix(1,0,0,1,855.93,1106.25)" d="M-17.5,19.6C1,19.6,-3.4,-19.6,17.5,-19.6" id="463" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="333" stroke-linejoin="round" ed:tosuperid="464" transform="matrix(1,0,0,1,855.93,1121.38)" d="M-17.5,4.5C-2.5,4.5,4.6,-4.5,17.5,-4.5" id="465" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="333" stroke-linejoin="round" ed:tosuperid="466" transform="matrix(1,0,0,1,855.93,1145.5)" d="M-17.5,-19.6C1,-19.6,-3.4,19.6,17.5,19.6" id="467" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="462" stroke-linejoin="round" ed:tosuperid="468" transform="matrix(1,0,0,1,1015.7,1086.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="469" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="464" stroke-linejoin="round" ed:tosuperid="474" transform="matrix(1,0,0,1,1042.36,1116.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="475" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="478" stroke-linejoin="round" ed:tosuperid="479" transform="matrix(1,0,0,1,775.5,1244.56)" d="M-17.5,22.7C1.6,22.7,-4.9,-22.7,17.5,-22.7" id="491" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="478" stroke-linejoin="round" ed:tosuperid="480" transform="matrix(1,0,0,1,775.5,1259.69)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="492" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="478" stroke-linejoin="round" ed:tosuperid="481" transform="matrix(1,0,0,1,775.5,1274.81)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="493" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="478" stroke-linejoin="round" ed:tosuperid="482" transform="matrix(1,0,0,1,775.5,1289.94)" d="M-17.5,-22.7C1.6,-22.7,-4.9,22.7,17.5,22.7" id="494" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="486" stroke-linejoin="round" ed:tosuperid="483" transform="matrix(1,0,0,1,788.83,1373.13)" d="M-17.5,30.3C3.1,30.3,-8.4,-30.3,17.5,-30.3" id="495" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="486" stroke-linejoin="round" ed:tosuperid="484" transform="matrix(1,0,0,1,788.83,1388.25)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="496" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="486" stroke-linejoin="round" ed:tosuperid="485" transform="matrix(1,0,0,1,788.83,1403.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="497" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="486" stroke-linejoin="round" ed:tosuperid="487" transform="matrix(1,0,0,1,788.83,1418.5)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="498" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="486" stroke-linejoin="round" ed:tosuperid="488" transform="matrix(1,0,0,1,788.83,1433.63)" d="M-17.5,-30.3C3.1,-30.3,-8.4,30.3,17.5,30.3" id="499" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="490" stroke-linejoin="round" ed:tosuperid="489" transform="matrix(1,0,0,1,788.83,1494.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="500" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="120" stroke-linejoin="round" ed:tosuperid="478" transform="matrix(1,0,0,1,615.73,1323.97)" d="M-17.5,56.7C6.5,56.7,-16.4,-56.7,17.5,-56.7" id="501" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="120" stroke-linejoin="round" ed:tosuperid="486" transform="matrix(1,0,0,1,615.73,1392.03)" d="M-17.5,-11.3C-0.9,-11.3,0.9,11.3,17.5,11.3" id="502" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="120" stroke-linejoin="round" ed:tosuperid="490" transform="matrix(1,0,0,1,615.73,1437.41)" d="M-17.5,-56.7C6.5,-56.7,-16.4,56.7,17.5,56.7" id="503" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="317" stroke-linejoin="round" ed:tosuperid="553" transform="matrix(1,0,0,1,845.26,533.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="554" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="321" stroke-linejoin="round" ed:tosuperid="555" transform="matrix(1,0,0,1,655.5,616.69)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="556" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="430" stroke-linejoin="round" ed:tosuperid="557" transform="matrix(1,0,0,1,941.03,669.63)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="558" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="430" stroke-linejoin="round" ed:tosuperid="559" transform="matrix(1,0,0,1,941.03,684.75)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="560" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="430" stroke-linejoin="round" ed:tosuperid="562" transform="matrix(1,0,0,1,941.03,699.88)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="563" stroke="#ff7575" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="637" stroke-linejoin="round" ed:tosuperid="639" transform="matrix(1,0,0,1,549.06,3070.16)" d="M-17.5,-232.1C7,-232.1,-17.5,232.1,17.5,232.1" id="552" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="637" stroke-linejoin="round" ed:tosuperid="640" transform="matrix(1,0,0,1,549.06,3206.09)" d="M-17.5,-368C7,-368,-17.5,368,17.5,368" id="561" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="637" stroke-linejoin="round" ed:tosuperid="641" transform="matrix(1,0,0,1,549.06,2522.97)" d="M-17.5,315.1C7,315.1,-17.5,-315.1,17.5,-315.1" id="564" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="637" stroke-linejoin="round" ed:tosuperid="642" transform="matrix(1,0,0,1,549.06,2701.18)" d="M-17.5,136.9C7,136.9,-17.5,-136.9,17.5,-136.9" id="565" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="739" stroke-linejoin="round" ed:tosuperid="643" transform="matrix(1,0,0,1,809.93,2238.13)" d="M-17.5,30.3C3.1,30.3,-8.4,-30.3,17.5,-30.3" id="566" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="739" stroke-linejoin="round" ed:tosuperid="644" transform="matrix(1,0,0,1,809.93,2275.94)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="567" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="739" stroke-linejoin="round" ed:tosuperid="645" transform="matrix(1,0,0,1,809.93,2298.63)" d="M-17.5,-30.3C3.1,-30.3,-8.4,30.3,17.5,30.3" id="568" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="643" stroke-linejoin="round" ed:tosuperid="646" transform="matrix(1,0,0,1,1074.36,2207.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="569" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="646" stroke-linejoin="round" ed:tosuperid="647" transform="matrix(1,0,0,1,1365.46,2192.75)" d="M-17.6,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="570" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="646" stroke-linejoin="round" ed:tosuperid="648" transform="matrix(1,0,0,1,1365.46,2207.88)" d="M-17.6,0C-3.5,0,7,0,17.5,0" id="571" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="646" stroke-linejoin="round" ed:tosuperid="649" transform="matrix(1,0,0,1,1365.46,2223)" d="M-17.6,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="572" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="644" stroke-linejoin="round" ed:tosuperid="650" transform="matrix(1,0,0,1,994.36,2283.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="573" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="650" stroke-linejoin="round" ed:tosuperid="651" transform="matrix(1,0,0,1,1238.8,2275.94)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="574" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="650" stroke-linejoin="round" ed:tosuperid="652" transform="matrix(1,0,0,1,1238.8,2291.06)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="575" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="645" stroke-linejoin="round" ed:tosuperid="653" transform="matrix(1,0,0,1,994.36,2328.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="576" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="653" stroke-linejoin="round" ed:tosuperid="654" transform="matrix(1,0,0,1,1183.46,2328.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="577" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="657" stroke-linejoin="round" ed:tosuperid="660" transform="matrix(1,0,0,1,971.7,2777.03)" d="M-17.5,-11.3C-0.9,-11.3,0.9,11.3,17.5,11.3" id="578" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="655" transform="matrix(1,0,0,1,787.26,2665.48)" d="M-17.5,104C7,104,-17.5,-104,17.5,-104" id="579" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="656" transform="matrix(1,0,0,1,787.26,2714.64)" d="M-17.5,54.8C6.4,54.8,-16.1,-54.8,17.5,-54.8" id="580" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="657" transform="matrix(1,0,0,1,787.26,2767.58)" d="M-17.5,1.9C-3.1,1.9,6,-1.9,17.5,-1.9" id="581" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="658" transform="matrix(1,0,0,1,787.26,2794.05)" d="M-17.5,-24.6C2,-24.6,-5.8,24.6,17.5,24.6" id="582" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="659" transform="matrix(1,0,0,1,787.26,2809.17)" d="M-17.5,-39.7C4.7,-39.7,-12,39.7,17.5,39.7" id="583" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="715" stroke-linejoin="round" ed:tosuperid="661" transform="matrix(1,0,0,1,787.26,2873.45)" d="M-17.5,-104C7,-104,-17.5,104,17.5,104" id="584" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="712" stroke-linejoin="round" ed:tosuperid="662" transform="matrix(1,0,0,1,1118.8,2561.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="585" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="662" stroke-linejoin="round" ed:tosuperid="663" transform="matrix(1,0,0,1,1332.56,2553.94)" d="M-17.6,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="586" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="662" stroke-linejoin="round" ed:tosuperid="664" transform="matrix(1,0,0,1,1332.56,2569.06)" d="M-17.6,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="587" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="656" stroke-linejoin="round" ed:tosuperid="665" transform="matrix(1,0,0,1,971.7,2640.91)" d="M-17.5,18.9C0.8,18.9,-3.1,-18.9,17.5,-18.9" id="588" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="657" stroke-linejoin="round" ed:tosuperid="666" transform="matrix(1,0,0,1,971.7,2754.34)" d="M-17.5,11.3C-0.9,11.3,0.9,-11.3,17.5,-11.3" id="589" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="665" stroke-linejoin="round" ed:tosuperid="667" transform="matrix(1,0,0,1,1360.13,2614.44)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.6,-7.6" id="590" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="665" stroke-linejoin="round" ed:tosuperid="668" transform="matrix(1,0,0,1,1360.13,2629.56)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.6,7.6" id="591" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="656" stroke-linejoin="round" ed:tosuperid="669" transform="matrix(1,0,0,1,971.7,2663.59)" d="M-17.5,-3.8C-2.6,-3.8,4.9,3.8,17.5,3.8" id="592" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="656" stroke-linejoin="round" ed:tosuperid="670" transform="matrix(1,0,0,1,971.7,2678.72)" d="M-17.5,-18.9C0.8,-18.9,-3.1,18.9,17.5,18.9" id="593" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="670" stroke-linejoin="round" ed:tosuperid="671" transform="matrix(1,0,0,1,1332.8,2697.63)" d="M-17.6,0C-3.5,0,7,0,17.5,0" id="594" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="666" stroke-linejoin="round" ed:tosuperid="672" transform="matrix(1,0,0,1,1314.8,2735.44)" d="M-17.6,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="595" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="666" stroke-linejoin="round" ed:tosuperid="673" transform="matrix(1,0,0,1,1314.8,2750.56)" d="M-17.6,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="596" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="658" stroke-linejoin="round" ed:tosuperid="674" transform="matrix(1,0,0,1,918.36,2818.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="597" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="659" stroke-linejoin="round" ed:tosuperid="675" transform="matrix(1,0,0,1,958.36,2848.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="598" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="713" stroke-linejoin="round" ed:tosuperid="676" transform="matrix(1,0,0,1,1202.8,2894.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="599" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="661" stroke-linejoin="round" ed:tosuperid="677" transform="matrix(1,0,0,1,1011.7,2966.09)" d="M-17.5,11.3C-0.9,11.3,0.9,-11.3,17.5,-11.3" id="600" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="661" stroke-linejoin="round" ed:tosuperid="678" transform="matrix(1,0,0,1,1011.7,2996.34)" d="M-17.5,-18.9C0.8,-18.9,-3.1,18.9,17.5,18.9" id="601" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="661" stroke-linejoin="round" ed:tosuperid="679" transform="matrix(1,0,0,1,1011.7,3019.03)" d="M-17.5,-41.6C4.9,-41.6,-12.7,41.6,17.5,41.6" id="602" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="676" stroke-linejoin="round" ed:tosuperid="680" transform="matrix(1,0,0,1,1493.9,2886.69)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.6,-7.6" id="603" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="676" stroke-linejoin="round" ed:tosuperid="681" transform="matrix(1,0,0,1,1493.9,2901.81)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.6,7.6" id="604" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="677" stroke-linejoin="round" ed:tosuperid="682" transform="matrix(1,0,0,1,1295.46,2947.19)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="605" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="677" stroke-linejoin="round" ed:tosuperid="683" transform="matrix(1,0,0,1,1295.46,2962.31)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="606" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="678" stroke-linejoin="round" ed:tosuperid="684" transform="matrix(1,0,0,1,1206.8,3007.69)" d="M-17.6,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="607" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="678" stroke-linejoin="round" ed:tosuperid="685" transform="matrix(1,0,0,1,1206.8,3022.81)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="608" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="686" transform="matrix(1,0,0,1,655.5,3205.56)" d="M-17.5,96.7C7,96.7,-17.5,-96.7,17.5,-96.7" id="609" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="687" transform="matrix(1,0,0,1,655.5,3229.69)" d="M-17.5,72.6C7,72.6,-17.5,-72.6,17.5,-72.6" id="610" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="688" transform="matrix(1,0,0,1,655.5,3253.81)" d="M-17.5,48.4C5.8,48.4,-14.7,-48.4,17.5,-48.4" id="611" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="689" transform="matrix(1,0,0,1,655.5,3285.5)" d="M-17.5,16.8C0.3,16.8,-2,-16.8,17.5,-16.8" id="612" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="690" transform="matrix(1,0,0,1,655.5,3334.66)" d="M-17.5,-32.4C3.5,-32.4,-9.3,32.4,17.5,32.4" id="613" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="639" stroke-linejoin="round" ed:tosuperid="691" transform="matrix(1,0,0,1,655.5,3398.94)" d="M-17.5,-96.7C7,-96.7,-17.5,96.7,17.5,96.7" id="614" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="686" stroke-linejoin="round" ed:tosuperid="692" transform="matrix(1,0,0,1,879.93,3108.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="615" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="687" stroke-linejoin="round" ed:tosuperid="693" transform="matrix(1,0,0,1,919.93,3157.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="616" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="688" stroke-linejoin="round" ed:tosuperid="694" transform="matrix(1,0,0,1,826.6,3197.81)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="617" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="688" stroke-linejoin="round" ed:tosuperid="695" transform="matrix(1,0,0,1,826.6,3212.94)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="618" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="689" stroke-linejoin="round" ed:tosuperid="696" transform="matrix(1,0,0,1,839.93,3261.19)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="619" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="694" stroke-linejoin="round" ed:tosuperid="697" transform="matrix(1,0,0,1,996.36,3190.25)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="620" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="689" stroke-linejoin="round" ed:tosuperid="698" transform="matrix(1,0,0,1,839.93,3276.31)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="621" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="698" stroke-linejoin="round" ed:tosuperid="699" transform="matrix(1,0,0,1,955.7,3283.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="622" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="690" stroke-linejoin="round" ed:tosuperid="700" transform="matrix(1,0,0,1,906.6,3348.16)" d="M-17.5,18.9C0.8,18.9,-3.1,-18.9,17.5,-18.9" id="623" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="700" stroke-linejoin="round" ed:tosuperid="701" transform="matrix(1,0,0,1,1314.36,3321.69)" d="M-17.6,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="624" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="700" stroke-linejoin="round" ed:tosuperid="702" transform="matrix(1,0,0,1,1314.36,3336.81)" d="M-17.6,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="625" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="690" stroke-linejoin="round" ed:tosuperid="703" transform="matrix(1,0,0,1,906.6,3385.97)" d="M-17.5,-18.9C0.8,-18.9,-3.1,18.9,17.5,18.9" id="626" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="703" stroke-linejoin="round" ed:tosuperid="704" transform="matrix(1,0,0,1,1169.7,3389.75)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="627" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="703" stroke-linejoin="round" ed:tosuperid="705" transform="matrix(1,0,0,1,1169.7,3404.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="628" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="703" stroke-linejoin="round" ed:tosuperid="706" transform="matrix(1,0,0,1,1169.7,3420)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="629" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="691" stroke-linejoin="round" ed:tosuperid="707" transform="matrix(1,0,0,1,879.93,3480.5)" d="M-17.5,15.1C-0,15.1,-1.1,-15.1,17.5,-15.1" id="630" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="691" stroke-linejoin="round" ed:tosuperid="708" transform="matrix(1,0,0,1,879.93,3495.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="631" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="691" stroke-linejoin="round" ed:tosuperid="709" transform="matrix(1,0,0,1,879.93,3510.75)" d="M-17.5,-15.1C-0,-15.1,-1.1,15.1,17.5,15.1" id="632" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="640" stroke-linejoin="round" ed:tosuperid="710" transform="matrix(1,0,0,1,705.5,3566.56)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="633" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="640" stroke-linejoin="round" ed:tosuperid="711" transform="matrix(1,0,0,1,705.5,3581.69)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="634" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="655" stroke-linejoin="round" ed:tosuperid="712" transform="matrix(1,0,0,1,929.7,2561.5)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="635" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="661" stroke-linejoin="round" ed:tosuperid="713" transform="matrix(1,0,0,1,1011.7,2935.84)" d="M-17.5,41.6C4.9,41.6,-12.7,-41.6,17.5,-41.6" id="636" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="104" stroke-linejoin="round" ed:tosuperid="637" transform="matrix(1,0,0,1,389.3,2473.72)" d="M-17.5,-364.3C7,-364.3,-17.5,364.3,17.5,364.3" id="714" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="642" stroke-linejoin="round" ed:tosuperid="715" transform="matrix(1,0,0,1,682.83,2666.88)" d="M-17.5,-102.6C7,-102.6,-17.5,102.6,17.5,102.6" id="716" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="720" stroke-linejoin="round" ed:tosuperid="717" transform="matrix(1,0,0,1,762.6,2407.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="721" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="719" stroke-linejoin="round" ed:tosuperid="718" transform="matrix(1,0,0,1,762.6,2359.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="722" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="642" stroke-linejoin="round" ed:tosuperid="719" transform="matrix(1,0,0,1,682.83,2461.71)" d="M-17.5,102.6C7,102.6,-17.5,-102.6,17.5,-102.6" id="723" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="642" stroke-linejoin="round" ed:tosuperid="720" transform="matrix(1,0,0,1,682.83,2485.84)" d="M-17.5,78.5C7,78.5,-17.5,-78.5,17.5,-78.5" id="724" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="727" stroke-linejoin="round" ed:tosuperid="728" transform="matrix(1,0,0,1,762.6,2481.38)" d="M-17.5,-4.5C-2.5,-4.5,4.6,4.5,17.5,4.5" id="732" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="727" stroke-linejoin="round" ed:tosuperid="725" transform="matrix(1,0,0,1,762.6,2457.25)" d="M-17.5,19.6C1,19.6,-3.4,-19.6,17.5,-19.6" id="733" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="727" stroke-linejoin="round" ed:tosuperid="731" transform="matrix(1,0,0,1,762.6,2496.5)" d="M-17.5,-19.6C1,-19.6,-3.4,19.6,17.5,19.6" id="734" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="725" stroke-linejoin="round" ed:tosuperid="726" transform="matrix(1,0,0,1,895.7,2437.63)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="735" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="728" stroke-linejoin="round" ed:tosuperid="729" transform="matrix(1,0,0,1,895.7,2485.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="736" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="731" stroke-linejoin="round" ed:tosuperid="730" transform="matrix(1,0,0,1,869.03,2516.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="737" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="642" stroke-linejoin="round" ed:tosuperid="727" transform="matrix(1,0,0,1,682.83,2520.59)" d="M-17.5,43.7C5.2,43.7,-13.4,-43.7,17.5,-43.7" id="738" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="641" stroke-linejoin="round" ed:tosuperid="739" transform="matrix(1,0,0,1,682.83,2238.13)" d="M-17.5,-30.3C3.1,-30.3,-8.4,30.3,17.5,30.3" id="740" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="745" stroke-linejoin="round" ed:tosuperid="744" transform="matrix(1,0,0,1,628.83,2094.44)" d="M-17.5,7.6C-1.7,7.6,2.9,-7.6,17.5,-7.6" id="746" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="745" stroke-linejoin="round" ed:tosuperid="743" transform="matrix(1,0,0,1,628.83,2109.56)" d="M-17.5,-7.6C-1.7,-7.6,2.9,7.6,17.5,7.6" id="747" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="744" stroke-linejoin="round" ed:tosuperid="741" transform="matrix(1,0,0,1,735.26,2086.88)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="748" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="743" stroke-linejoin="round" ed:tosuperid="742" transform="matrix(1,0,0,1,735.26,2117.13)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="749" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="637" stroke-linejoin="round" ed:tosuperid="745" transform="matrix(1,0,0,1,549.06,2470.03)" d="M-17.5,368C7,368,-17.5,-368,17.5,-368" id="750" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="752" stroke-linejoin="round" ed:tosuperid="751" transform="matrix(1,0,0,1,762.6,2147.38)" d="M-17.5,0C-3.5,0,7,0,17.5,0" id="753" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <path stroke-linecap="round" ed:parentid="641" stroke-linejoin="round" ed:tosuperid="752" transform="matrix(1,0,0,1,682.83,2177.63)" d="M-17.5,30.3C3.1,30.3,-8.4,-30.3,17.5,-30.3" id="754" stroke="#5fb7f1" fill="none" stroke-width="2"/>
    <g ed:topictype="mainidea" transform="matrix(1,0,0,1,24,1232.22)" ed:height="64.33333333333334" id="101" ed:width="153.08" ed:layout="rightmap">
        <path stroke-linejoin="round" d="M32.2,0L120.9,0C138.7,0,153.1,14.4,153.1,32.2C153.1,49.9,138.7,64.3,120.9,64.3L32.2,64.3C14.4,64.3,0,49.9,0,32.2C0,14.4,14.4,0,32.2,0z" stroke="#ffffff" fill="#ffffff" stroke-width="4"/>
        <text class="st2">
            <tspan textLength="96" x="27" style="white-space:pre" y="40.617">项目架构</tspan>
        </text>
    </g>
    <g ed:parentid="101" transform="matrix(1,0,0,1,240.08,381.97)" ed:height="37.41666666666667" id="102" ed:width="131.6666666666667">
        <path stroke-linejoin="round" d="M0,37.4L131.7,37.4" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st3">
            <tspan textLength="76" x="17" style="white-space:pre" y="24.933">在线部分</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>从用户请求开始，通过werobot服务，在werobot服务内部请求主服务，在主服务中将调用会话管理数据库redis, 调用句子相关模型服务，以及调用图数据库，最后将查询结果输送给对话规则模版或者使用Unit对话API回复&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(99,11)"/>
        </g>
    </g>
    <symbol id="imgnote">
        <image xlink:href="" width="16" height="16"/>
    </symbol>
    <g ed:parentid="101" transform="matrix(1,0,0,1,240.08,2071.96)" ed:height="37.41666666666667" id="104" ed:width="131.6666666666667">
        <path stroke-linejoin="round" d="M0,37.4L131.7,37.4" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st3">
            <tspan textLength="76" x="17" style="white-space:pre" y="24.933">离线部分</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>从数据采集开始，将获得结构化和非结构化的数据，对于结构化数据将直接使用实体审核模型进行审核，然后写入图数据库; 对于非结构化数据，将使用NER模型进行实体抽取，然后通过实体审核后再写入图数据库。&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(99,11)"/>
        </g>
    </g>
    <g ed:parentid="102" transform="matrix(1,0,0,1,406.85,57.81)" ed:height="23.75" id="108" ed:width="125.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L125.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="103" x="8" style="white-space:pre" y="15.308">werobot服务模块</tspan>
        </text>
    </g>
    <g ed:parentid="102" transform="matrix(1,0,0,1,406.85,305.03)" ed:height="23.75" id="110" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">主要逻辑服务模块</tspan>
        </text>
    </g>
    <g ed:parentid="102" transform="matrix(1,0,0,1,406.85,733.47)" ed:height="23.75" id="112" ed:width="151.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L151.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="130" x="8" style="white-space:pre" y="15.308">句子相关模型服务模块</tspan>
        </text>
    </g>
    <g ed:parentid="305" transform="matrix(1,0,0,1,646.38,171.25)" ed:height="23.75" id="114" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">会话管理模块(redis)</tspan>
        </text>
    </g>
    <g ed:parentid="305" transform="matrix(1,0,0,1,646.38,201.5)" ed:height="23.75" id="116" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">Neo4j图数据库模块</tspan>
        </text>
    </g>
    <g ed:parentid="305" transform="matrix(1,0,0,1,646.38,231.75)" ed:height="23.75" id="118" ed:width="130">
        <path stroke-linejoin="round" d="M0,23.8L130,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="110" x="8" style="white-space:pre" y="15.308">规则对话/Unit模块</tspan>
        </text>
    </g>
    <g ed:parentid="104" transform="matrix(1,0,0,1,406.85,1356.94)" ed:height="23.75" id="120" ed:width="191.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L191.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="169" x="8" style="white-space:pre" y="15.308">结构与非结构化数据采集模块</tspan>
        </text>
    </g>
    <g ed:parentid="104" transform="matrix(1,0,0,1,406.85,1650.7)" ed:height="23.75" id="132" ed:width="116">
        <path stroke-linejoin="round" d="M0,23.8L116,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="96" x="8" style="white-space:pre" y="15.308">命名实体审核NE</tspan>
        </text>
    </g>
    <g ed:parentid="114" transform="matrix(1,0,0,1,819.48,171.25)" ed:height="23.75" id="207" ed:width="172">
        <path stroke-linejoin="round" d="M0,23.8L172,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="149" x="8" style="white-space:pre" y="15.308">Redis数据库保存聊天记录</tspan>
        </text>
    </g>
    <g ed:parentid="118" transform="matrix(1,0,0,1,811.48,231.75)" ed:height="23.75" id="209" ed:width="178">
        <path stroke-linejoin="round" d="M0,23.8L178,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="156" x="8" style="white-space:pre" y="15.308" class="st6">用于微信公众号中闲聊功能</tspan>
        </text>
    </g>
    <g ed:parentid="116" transform="matrix(1,0,0,1,817.48,201.5)" ed:height="23.75" id="211" ed:width="151.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L151.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="130" x="8" style="white-space:pre" y="15.308">保存命名审核后的数据</tspan>
        </text>
    </g>
    <g ed:parentid="293" transform="matrix(1,0,0,1,647.05,20)" ed:height="23.75" id="289" ed:width="498">
        <path stroke-linejoin="round" d="M0,23.8L498,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="468" x="8" style="white-space:pre" y="15.308">连接微信客户端和后端服务，向主要逻辑服务发送用户请求，接受数据返回给用户</tspan>
        </text>
    </g>
    <g ed:parentid="321" transform="matrix(1,0,0,1,673.05,570.25)" ed:height="23.75" id="291" ed:width="511.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L511.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="481" x="8" style="white-space:pre" y="15.308">用于封装训练好的句子相关判断模型，接收来自主要逻辑服务的请求，返回判断结果</tspan>
        </text>
    </g>
    <g ed:parentid="108" transform="matrix(1,0,0,1,567.28,20)" ed:height="23.75" id="293" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">作用</tspan>
        </text>
    </g>
    <g ed:parentid="108" transform="matrix(1,0,0,1,567.28,95.63)" ed:height="23.75" id="295" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">构建流程</tspan>
        </text>
    </g>
    <g ed:parentid="295" transform="matrix(1,0,0,1,673.71,50.25)" ed:height="23.75" id="297" ed:width="123.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L123.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="103" x="8" style="white-space:pre" y="15.308">获取服务器公网IP</tspan>
        </text>
    </g>
    <g ed:parentid="295" transform="matrix(1,0,0,1,673.71,80.5)" ed:height="23.75" id="299" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">配置微信公众号</tspan>
        </text>
    </g>
    <g ed:parentid="295" transform="matrix(1,0,0,1,673.71,110.75)" ed:height="23.75" id="301" ed:width="178.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L178.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="155" x="8" style="white-space:pre" y="15.308">使用werobot启动服务脚本</tspan>
        </text>
    </g>
    <g ed:parentid="295" transform="matrix(1,0,0,1,673.71,141)" ed:height="23.75" id="303" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">使用微信公众号测试</tspan>
        </text>
    </g>
    <g ed:parentid="110" transform="matrix(1,0,0,1,566.61,201.5)" ed:height="23.75" id="305" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">功能</tspan>
        </text>
    </g>
    <g ed:parentid="110" transform="matrix(1,0,0,1,566.61,408.56)" ed:height="23.75" id="307" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">构建流程</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,277.13)" ed:height="23.75" id="309" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">导入必备工具和配置</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,322.5)" ed:height="41.75" id="311" ed:width="186.6666666666667">
        <path stroke-linejoin="round" d="M0,41.8L186.7,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="164" x="8" style="white-space:pre" y="15.308" class="st6">完成查询neo4j数据库的函数</tspan>
            <tspan textLength="41" x="8" style="white-space:pre" y="33.308">app.py</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,383)" ed:height="41.75" id="313" ed:width="138">
        <path stroke-linejoin="round" d="M0,41.8L138,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">编写主要逻辑处理类</tspan>
            <tspan textLength="41" x="8" style="white-space:pre" y="33.308" class="st8">app.py</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,461.5)" ed:height="41.75" id="315" ed:width="138">
        <path stroke-linejoin="round" d="M0,41.8L138,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">编写服务中的主函数</tspan>
            <tspan textLength="41" x="8" style="white-space:pre" y="33.308" class="st8">app.py</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,509.75)" ed:height="23.75" id="317" ed:width="154.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L154.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="133" x="8" style="white-space:pre" y="15.308">使用gunicorn启用服务</tspan>
        </text>
    </g>
    <g ed:parentid="307" transform="matrix(1,0,0,1,673.05,540)" ed:height="23.75" id="319" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">编写测试脚本测试</tspan>
        </text>
    </g>
    <g ed:parentid="112" transform="matrix(1,0,0,1,593.28,585.38)" ed:height="23.75" id="321" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">作用</tspan>
        </text>
    </g>
    <g ed:parentid="112" transform="matrix(1,0,0,1,593.28,881.56)" ed:height="23.75" id="323" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">相关任务</tspan>
        </text>
    </g>
    <g ed:parentid="323" transform="matrix(1,0,0,1,699.71,661)" ed:height="23.75" id="325" ed:width="84.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L84.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="65" x="8" style="white-space:pre" y="15.308">训练数据集</tspan>
        </text>
    </g>
    <g ed:parentid="323" transform="matrix(1,0,0,1,699.71,721.5)" ed:height="41.75" id="327" ed:width="168.6666666666667">
        <path stroke-linejoin="round" d="M0,41.8L168.7,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="121" x="8" style="white-space:pre" y="15.308" class="st6">BERT中文预训练模型</tspan>
            <tspan textLength="146" x="8" style="white-space:pre" y="33.308">bert_chinese_encode.py</tspan>
        </text>
    </g>
    <g ed:parentid="323" transform="matrix(1,0,0,1,699.71,769.75)" ed:height="41.75" id="329" ed:width="127.3333333333333">
        <path stroke-linejoin="round" d="M0,41.8L127.3,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308" class="st6">微调模型</tspan>
            <tspan textLength="107" x="8" style="white-space:pre" y="33.308">finetuning_net.py</tspan>
        </text>
    </g>
    <g ed:parentid="323" transform="matrix(1,0,0,1,699.71,913.44)" ed:height="41.75" id="331" ed:width="98">
        <path stroke-linejoin="round" d="M0,41.8L98,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308" class="st6">进行模型训练</tspan>
            <tspan textLength="46" x="8" style="white-space:pre" y="33.308">train.py</tspan>
        </text>
    </g>
    <g ed:parentid="323" transform="matrix(1,0,0,1,699.71,1102.13)" ed:height="23.75" id="333" ed:width="138.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L138.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="116" x="8" style="white-space:pre" y="15.308">模型部署(Flask框架)</tspan>
        </text>
    </g>
    <g ed:parentid="132" transform="matrix(1,0,0,1,557.95,1500.63)" ed:height="23.75" id="335" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">作用</tspan>
        </text>
    </g>
    <g ed:parentid="335" transform="matrix(1,0,0,1,637.71,1500.63)" ed:height="23.75" id="339" ed:width="231.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L231.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="208" x="8" style="white-space:pre" y="15.308">对识别出来的实体进行合法性的检验</tspan>
        </text>
    </g>
    <g ed:parentid="132" transform="matrix(1,0,0,1,557.95,1546)" ed:height="23.75" id="341" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">模型选择</tspan>
        </text>
    </g>
    <g ed:parentid="341" transform="matrix(1,0,0,1,664.38,1530.88)" ed:height="23.75" id="343" ed:width="181.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L181.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="160" x="8" style="white-space:pre" y="15.308">短文本任务，使用RNN模型</tspan>
        </text>
    </g>
    <g ed:parentid="341" transform="matrix(1,0,0,1,664.38,1561.13)" ed:height="23.75" id="345" ed:width="336.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L336.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="311" x="8" style="white-space:pre" y="15.308">使用bert-chinese预训练模型获得中文汉字的向量表示</tspan>
        </text>
    </g>
    <g ed:parentid="363" transform="matrix(1,0,0,1,637.71,1591.38)" ed:height="23.75" id="347" ed:width="84.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L84.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="65" x="8" style="white-space:pre" y="15.308">训练数据集</tspan>
        </text>
    </g>
    <g ed:parentid="347" transform="matrix(1,0,0,1,757.48,1591.38)" ed:height="23.75" id="349" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">将数据集加载到内存</tspan>
        </text>
    </g>
    <g ed:parentid="363" transform="matrix(1,0,0,1,637.71,1621.63)" ed:height="41.75" id="351" ed:width="168.6666666666667">
        <path stroke-linejoin="round" d="M0,41.8L168.7,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="121" x="8" style="white-space:pre" y="15.308" class="st6">BERT中文预训练模型</tspan>
            <tspan textLength="146" x="8" style="white-space:pre" y="33.308">bert_chinese_encode.py</tspan>
        </text>
    </g>
    <g ed:parentid="351" transform="matrix(1,0,0,1,841.48,1639.63)" ed:height="23.75" id="353" ed:width="248">
        <path stroke-linejoin="round" d="M0,23.8L248,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="223" x="8" style="white-space:pre" y="15.308">def get_bert_encode_for_single(text)</tspan>
        </text>
    </g>
    <g ed:parentid="363" transform="matrix(1,0,0,1,637.71,1682.13)" ed:height="41.75" id="355" ed:width="118.6666666666667">
        <path stroke-linejoin="round" d="M0,41.8L118.7,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="82" x="8" style="white-space:pre" y="15.308" class="st6">构建RNN模型</tspan>
            <tspan textLength="99" x="8" style="white-space:pre" y="33.308">RNN.MODEL.py</tspan>
        </text>
    </g>
    <g ed:parentid="355" transform="matrix(1,0,0,1,791.48,1669.88)" ed:height="23.75" id="357" ed:width="334">
        <path stroke-linejoin="round" d="M0,23.8L334,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="305" x="8" style="white-space:pre" y="15.308">def __init__(self,input_size,hidden_size,output_size)</tspan>
        </text>
    </g>
    <g ed:parentid="355" transform="matrix(1,0,0,1,791.48,1700.13)" ed:height="23.75" id="359" ed:width="223.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L223.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="197" x="8" style="white-space:pre" y="15.308">def forward(self,input1,hidden1)</tspan>
        </text>
    </g>
    <g ed:parentid="355" transform="matrix(1,0,0,1,791.48,1730.38)" ed:height="23.75" id="361" ed:width="138.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L138.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="116" x="8" style="white-space:pre" y="15.308">def initHidden(self)</tspan>
        </text>
    </g>
    <g ed:parentid="132" transform="matrix(1,0,0,1,557.95,1800.78)" ed:height="23.75" id="363" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">流程</tspan>
        </text>
    </g>
    <g ed:parentid="363" transform="matrix(1,0,0,1,637.71,1833.38)" ed:height="41.75" id="365" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,41.8L71.3,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308" class="st6">模型训练</tspan>
            <tspan textLength="46" x="8" style="white-space:pre" y="33.308">train.py</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1760.63)" ed:height="23.75" id="367" ed:width="162.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L162.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="141" x="8" style="white-space:pre" y="15.308">1.构建随机选取数据函数</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1790.88)" ed:height="23.75" id="369" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">2.构建模型训练函数</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1836.25)" ed:height="23.75" id="371" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">3.构建模型验证函数</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1881.63)" ed:height="23.75" id="373" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">4.调用训练和验证函数</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1911.88)" ed:height="23.75" id="375" ed:width="269.3333333333334">
        <path stroke-linejoin="round" d="M0,23.8L269.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="245" x="8" style="white-space:pre" y="15.308">5.绘制训练和验证的损失和准确率对照曲线</tspan>
        </text>
    </g>
    <g ed:parentid="365" transform="matrix(1,0,0,1,744.15,1942.13)" ed:height="23.75" id="377" ed:width="82.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L82.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="63" x="8" style="white-space:pre" y="15.308">6.模型保存</tspan>
        </text>
    </g>
    <g ed:parentid="367" transform="matrix(1,0,0,1,941.91,1760.63)" ed:height="23.75" id="379" ed:width="250">
        <path stroke-linejoin="round" d="M0,23.8L250,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="222" x="8" style="white-space:pre" y="15.308">def randomTrainExample(train_data)</tspan>
        </text>
    </g>
    <g ed:parentid="369" transform="matrix(1,0,0,1,915.25,1790.88)" ed:height="23.75" id="381" ed:width="275">
        <path stroke-linejoin="round" d="M0,23.8L275,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="228" x="8" style="white-space:pre" y="15.308">def train(category_tensor,line_tensor)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>(类别张量，编码后的文本张量)&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(250,4)"/>
        </g>
    </g>
    <g ed:parentid="371" transform="matrix(1,0,0,1,915.25,1821.13)" ed:height="23.75" id="387" ed:width="255.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L255.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="228" x="8" style="white-space:pre" y="15.308">def valid(category_tensor,line_tensor)</tspan>
        </text>
    </g>
    <g ed:parentid="371" transform="matrix(1,0,0,1,915.25,1851.38)" ed:height="23.75" id="389" ed:width="144.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L144.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="123" x="8" style="white-space:pre" y="15.308">def timeSince(since)</tspan>
        </text>
    </g>
    <g ed:parentid="377" transform="matrix(1,0,0,1,861.91,1942.13)" ed:height="23.75" id="391" ed:width="232.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L232.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="209" x="8" style="white-space:pre" y="15.308">torch.save(rnn.state_dict,保存路径)</tspan>
        </text>
    </g>
    <g ed:parentid="363" transform="matrix(1,0,0,1,637.71,1992.19)" ed:height="41.75" id="393" ed:width="82">
        <path stroke-linejoin="round" d="M0,41.8L82,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308" class="st6">模型使用</tspan>
            <tspan textLength="61" x="8" style="white-space:pre" y="33.308">predict.py</tspan>
        </text>
    </g>
    <g ed:parentid="393" transform="matrix(1,0,0,1,754.81,1987.5)" ed:height="23.75" id="395" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">模型预测</tspan>
        </text>
    </g>
    <g ed:parentid="393" transform="matrix(1,0,0,1,754.81,2032.88)" ed:height="23.75" id="397" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">模型批量预测</tspan>
        </text>
    </g>
    <g ed:parentid="395" transform="matrix(1,0,0,1,861.25,1972.38)" ed:height="23.75" id="399" ed:width="148.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L148.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="127" x="8" style="white-space:pre" y="15.308">def _test(line_tensor)</tspan>
        </text>
    </g>
    <g ed:parentid="395" transform="matrix(1,0,0,1,861.25,2002.63)" ed:height="23.75" id="401" ed:width="157.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L157.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="134" x="8" style="white-space:pre" y="15.308">def predict(input_line)</tspan>
        </text>
    </g>
    <g ed:parentid="399" transform="matrix(1,0,0,1,1045.01,1972.38)" ed:height="23.75" id="403" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">输入文本的张量表示</tspan>
        </text>
    </g>
    <g ed:parentid="401" transform="matrix(1,0,0,1,1053.68,2002.63)" ed:height="23.75" id="405" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">输入预测的文本</tspan>
        </text>
    </g>
    <g ed:parentid="397" transform="matrix(1,0,0,1,887.91,2032.88)" ed:height="23.75" id="407" ed:width="286">
        <path stroke-linejoin="round" d="M0,23.8L286,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="261" x="8" style="white-space:pre" y="15.308">def batch_predict(input_path,output_path)</tspan>
        </text>
    </g>
    <g ed:parentid="301" transform="matrix(1,0,0,1,887.48,110.75)" ed:height="23.75" id="409" ed:width="53.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L53.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="33" x="8" style="white-space:pre" y="15.308">wr.py</tspan>
        </text>
    </g>
    <g ed:parentid="309" transform="matrix(1,0,0,1,846.15,262)" ed:height="23.75" id="411" ed:width="62">
        <path stroke-linejoin="round" d="M0,23.8L62,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="41" x="8" style="white-space:pre" y="15.308">app.py</tspan>
        </text>
    </g>
    <g ed:parentid="309" transform="matrix(1,0,0,1,846.15,292.25)" ed:height="23.75" id="413" ed:width="77.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L77.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="57" x="8" style="white-space:pre" y="15.308">config.py</tspan>
        </text>
    </g>
    <g ed:parentid="311" transform="matrix(1,0,0,1,894.81,340.5)" ed:height="23.75" id="415" ed:width="153.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L153.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="131" x="8" style="white-space:pre" y="15.308">def query_neo4j(text)</tspan>
        </text>
    </g>
    <g ed:parentid="313" transform="matrix(1,0,0,1,846.15,401)" ed:height="23.75" id="417" ed:width="110.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L110.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="89" x="8" style="white-space:pre" y="15.308">class Handler()</tspan>
        </text>
    </g>
    <g ed:parentid="417" transform="matrix(1,0,0,1,991.91,370.75)" ed:height="23.75" id="419" ed:width="231.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L231.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="186" x="8" style="white-space:pre" y="15.308">def __init__(self,uid,text,r,reply)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> uid: 用户唯一标示uid&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> text: 该用户本次输入的文本&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> r: redis数据库的连接对象&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> reply: 规则对话模版加载到内存的对象(字典)&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(207,4)"/>
        </g>
    </g>
    <g ed:parentid="417" transform="matrix(1,0,0,1,991.91,401)" ed:height="23.75" id="421" ed:width="268.3333333333334">
        <path stroke-linejoin="round" d="M0,23.8L268.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="223" x="8" style="white-space:pre" y="15.308">def non_first_sentence(self,previous)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'寰蒋闆呴粦'; color:#000000;&quot;>description: 非首句处理函数&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'寰蒋闆呴粦'; color:#000000;&quot;>previous: 该用户当前句(输入文本)的上一句文本&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'寰蒋闆呴粦'; color:#000000;&quot;>return: 根据逻辑图返回非首句情况下的输出语句&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(243,4)"/>
        </g>
    </g>
    <g ed:parentid="417" transform="matrix(1,0,0,1,991.91,431.25)" ed:height="23.75" id="423" ed:width="179.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L179.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="138" x="8" style="white-space:pre" y="15.308">def first_sentence(self)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>首句处理函数&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(155,4)"/>
        </g>
    </g>
    <g ed:parentid="315" transform="matrix(1,0,0,1,846.15,479.5)" ed:height="23.75" id="426" ed:width="122.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L122.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="100" x="8" style="white-space:pre" y="15.308">def main_serve()</tspan>
        </text>
    </g>
    <g ed:parentid="319" transform="matrix(1,0,0,1,832.81,540)" ed:height="23.75" id="428" ed:width="60.66666666666666">
        <path stroke-linejoin="round" d="M0,23.8L60.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="42" x="8" style="white-space:pre" y="15.308">text.py</tspan>
        </text>
    </g>
    <g ed:parentid="325" transform="matrix(1,0,0,1,819.48,661)" ed:height="23.75" id="430" ed:width="104">
        <path stroke-linejoin="round" d="M0,23.8L104,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="84" x="8" style="white-space:pre" y="15.308">train_data.csv</tspan>
        </text>
    </g>
    <g ed:parentid="327" transform="matrix(1,0,0,1,903.48,739.5)" ed:height="23.75" id="432" ed:width="422.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L422.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="375" x="8" style="white-space:pre" y="15.308">def get_bert_encode(text_1, text_2, mark=102, max_len=10):</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>description: 使用bert中文模型对输入的文本对进行编码&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>text_1: 代表输入的第一句话&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>text_2: 代表输入的第二句话&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>mark: 分隔标记，是预训练模型tokenizer本身的标记符号，当输入是两个文本时，得到的index_tokens会以102进行分隔&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> max_len: 文本的允许最大长度，也是文本的规范长度即大于该长度要被截断，小于该长度要进行0补齐&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>return 输入文本的bert编码&lt;/span>&lt;/p>&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;  font-family:'微软雅黑';&quot;>&lt;br />&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(397,4)"/>
        </g>
    </g>
    <g ed:parentid="329" transform="matrix(1,0,0,1,862.15,787.75)" ed:height="23.75" id="434" ed:width="146.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L146.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="124" x="8" style="white-space:pre" y="15.308">class NET(nn.Model)</tspan>
        </text>
    </g>
    <g ed:parentid="434" transform="matrix(1,0,0,1,1043.91,772.63)" ed:height="23.75" id="436" ed:width="461">
        <path stroke-linejoin="round" d="M0,23.8L461,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="408" x="8" style="white-space:pre" y="15.308">def __init__(self, char_size=20, embedding_size=768, dropout=0.2)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>char_size: 输入句子中的字符数量，因为规范后每条句子长度是max_len, 因此char_size为2*max_len&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>embedding_size: 字嵌入的维度，因为使用的bert中文模型嵌入维度是768, 因此embedding_size为768&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>dropout: 为了防止过拟合，网络中将引入Dropout层，dropout为置0比率，默认是0.2&lt;/span>&lt;/p>&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;  font-family:'微软雅黑';&quot;>&lt;br />&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(436,4)"/>
        </g>
    </g>
    <g ed:parentid="434" transform="matrix(1,0,0,1,1043.91,802.88)" ed:height="23.75" id="438" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">def forward(self, x)</tspan>
        </text>
    </g>
    <g ed:parentid="444" transform="matrix(1,0,0,1,1017.25,833.13)" ed:height="23.75" id="440" ed:width="345">
        <path stroke-linejoin="round" d="M0,23.8L345,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="295" x="8" style="white-space:pre" y="15.308">def data_loader(data_path, batch_size, split=0.2)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>description: 从持久化文件中加载数据，并划分训练集和验证集及其批次大小&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>data_path: 训练数据的持久化路径&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>batch_size: 训练和验证数据集的批次大小&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>split: 训练集与验证的划分比例&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>return: 训练数据生成器，验证数据生成器，训练数据数量，验证数据数量&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(320,4)"/>
        </g>
    </g>
    <g ed:parentid="444" transform="matrix(1,0,0,1,1017.25,863.38)" ed:height="23.75" id="442" ed:width="216.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L216.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="169" x="8" style="white-space:pre" y="15.308">def _loader_generator(data)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>description: 获得训练集/验证集的每个批次数据的生成器&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>data: 训练数据或验证数据&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>return: 一个批次的训练数据或验证数据的生成器&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(191,4)"/>
        </g>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,848.25)" ed:height="23.75" id="444" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">1.构建数据加载器函数</tspan>
        </text>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,893.63)" ed:height="23.75" id="446" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">2.构建模型训练函数</tspan>
        </text>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,923.88)" ed:height="23.75" id="448" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">3.构建模型验证函数</tspan>
        </text>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,954.13)" ed:height="23.75" id="450" ed:width="216">
        <path stroke-linejoin="round" d="M0,23.8L216,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="193" x="8" style="white-space:pre" y="15.308">4.调用训练和验证函数并打印日志</tspan>
        </text>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,984.38)" ed:height="23.75" id="452" ed:width="269.3333333333334">
        <path stroke-linejoin="round" d="M0,23.8L269.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="245" x="8" style="white-space:pre" y="15.308">5.绘制训练和验证的损失和准确率对照曲线</tspan>
        </text>
    </g>
    <g ed:parentid="331" transform="matrix(1,0,0,1,832.81,1014.63)" ed:height="23.75" id="454" ed:width="82.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L82.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="63" x="8" style="white-space:pre" y="15.308">6.模型保存</tspan>
        </text>
    </g>
    <g ed:parentid="446" transform="matrix(1,0,0,1,1003.91,893.63)" ed:height="23.75" id="456" ed:width="206.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L206.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="161" x="8" style="white-space:pre" y="15.308">def train(train_data_labels)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>description: 训练函数，在这个过程中将更新模型参数，并收集准确率和损失&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>train_data_labels: 训练数据和标签的生成器对象&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>return: 整个训练过程的平均损失之和以及正确标签的累加数&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(181,4)"/>
        </g>
    </g>
    <g ed:parentid="448" transform="matrix(1,0,0,1,1003.91,923.88)" ed:height="23.75" id="458" ed:width="209">
        <path stroke-linejoin="round" d="M0,23.8L209,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="161" x="8" style="white-space:pre" y="15.308">def valid(valid_data_labels)</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>description: 验证函数，在这个过程中将验证模型的在新数据集上的标签，收集损失和准确率&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>valid_data_labels: 验证数据和标签的生成器对象&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;>return: 整个验证过程的平均损失之和以及正确标签的累加数&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(184,4)"/>
        </g>
    </g>
    <g ed:parentid="454" transform="matrix(1,0,0,1,950.58,1014.63)" ed:height="23.75" id="460" ed:width="281.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L281.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="257" x="8" style="white-space:pre" y="15.308">torch.save(rnn.state_dict(), MODEL_PATH)</tspan>
        </text>
    </g>
    <g ed:parentid="333" transform="matrix(1,0,0,1,873.48,1044.88)" ed:height="41.75" id="462" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,41.8L124.7,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308" class="st6">部署模型预测代码</tspan>
            <tspan textLength="41" x="8" style="white-space:pre" y="33.308">app.py</tspan>
        </text>
    </g>
    <g ed:parentid="333" transform="matrix(1,0,0,1,873.48,1093.13)" ed:height="23.75" id="464" ed:width="151.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L151.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="130" x="8" style="white-space:pre" y="15.308">以挂起的方式启动服务</tspan>
        </text>
    </g>
    <g ed:parentid="333" transform="matrix(1,0,0,1,873.48,1123.38)" ed:height="41.75" id="466" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,41.8L71.3,41.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">进行测试</tspan>
            <tspan textLength="41" x="8" style="white-space:pre" y="33.308" class="st8">test.py</tspan>
        </text>
    </g>
    <g ed:parentid="462" transform="matrix(1,0,0,1,1033.25,1062.88)" ed:height="23.75" id="468" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="102" x="8" style="white-space:pre" y="15.308">def recognition()</tspan>
        </text>
    </g>
    <g ed:parentid="464" transform="matrix(1,0,0,1,1059.91,1093.13)" ed:height="23.75" id="474" ed:width="268">
        <path stroke-linejoin="round" d="M0,23.8L268,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="242" x="8" style="white-space:pre" y="15.308">gunicorn -w 1 -b 0.0.0.0:5001 app:app </tspan>
        </text>
    </g>
    <g ed:parentid="120" transform="matrix(1,0,0,1,633.28,1243.5)" ed:height="23.75" id="478" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">结构化数据流水线</tspan>
        </text>
    </g>
    <g ed:parentid="478" transform="matrix(1,0,0,1,793.05,1198.13)" ed:height="23.75" id="479" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">结构化数据爬虫</tspan>
        </text>
    </g>
    <g ed:parentid="478" transform="matrix(1,0,0,1,793.05,1228.38)" ed:height="23.75" id="480" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">结构化数据清洗</tspan>
        </text>
    </g>
    <g ed:parentid="478" transform="matrix(1,0,0,1,793.05,1258.63)" ed:height="23.75" id="481" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">命名实体审核</tspan>
        </text>
    </g>
    <g ed:parentid="478" transform="matrix(1,0,0,1,793.05,1288.88)" ed:height="23.75" id="482" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">数据写入到图数据库</tspan>
        </text>
    </g>
    <g ed:parentid="486" transform="matrix(1,0,0,1,806.38,1319.13)" ed:height="23.75" id="483" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">非结构化数据爬虫</tspan>
        </text>
    </g>
    <g ed:parentid="486" transform="matrix(1,0,0,1,806.38,1349.38)" ed:height="23.75" id="484" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">非结构化数据清洗</tspan>
        </text>
    </g>
    <g ed:parentid="486" transform="matrix(1,0,0,1,806.38,1379.63)" ed:height="23.75" id="485" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">命名实体识别任务</tspan>
        </text>
    </g>
    <g ed:parentid="120" transform="matrix(1,0,0,1,633.28,1379.63)" ed:height="23.75" id="486" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">非结构化数据流水线</tspan>
        </text>
    </g>
    <g ed:parentid="486" transform="matrix(1,0,0,1,806.38,1409.88)" ed:height="23.75" id="487" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">命名实体审核任务</tspan>
        </text>
    </g>
    <g ed:parentid="486" transform="matrix(1,0,0,1,806.38,1440.13)" ed:height="23.75" id="488" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">数据写入到图数据库</tspan>
        </text>
    </g>
    <g ed:parentid="490" transform="matrix(1,0,0,1,806.38,1470.38)" ed:height="23.75" id="489" ed:width="334">
        <path stroke-linejoin="round" d="M0,23.8L334,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="311" x="8" style="white-space:pre" y="15.308">find ./ -name "*" -type f -size 0c | xargs -n 1 rm -f</tspan>
        </text>
    </g>
    <g ed:parentid="120" transform="matrix(1,0,0,1,633.28,1470.38)" ed:height="23.75" id="490" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="117" x="8" style="white-space:pre" y="15.308">删除审核后的空文件</tspan>
        </text>
    </g>
    <g ed:parentid="317" transform="matrix(1,0,0,1,862.81,511.75)" ed:height="21.75" id="553" ed:width="259.6666666666666">
        <path stroke-linejoin="round" d="M0,21.8L259.7,21.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st9">
            <tspan textLength="222" x="8" style="white-space:pre" y="13.975">gunicorn -w 1 -b 0.0.0.0:5000 app:app</tspan>
        </text>
        <g ed:note="&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> -w 代表开启的进程数，我们只开启一个进程&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> -b 服务的IP地址和端口&lt;/span>&lt;/p>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; &quot;>&lt;span style=&quot; font-family:'微软雅黑';&quot;> app:app 是指执行的主要对象位置，在app.py中的app对象&lt;/span>&lt;/p>&lt;/body>">
            <use xlink:href="#imgnote" transform="translate(235,3)"/>
        </g>
    </g>
    <g ed:parentid="321" transform="matrix(1,0,0,1,673.05,600.5)" ed:height="23.75" id="555" ed:width="191.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L191.3,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="169" x="8" style="white-space:pre" y="15.308">判断前后两句话是否有相关性</tspan>
        </text>
    </g>
    <g ed:parentid="430" transform="matrix(1,0,0,1,958.58,630.75)" ed:height="23.75" id="557" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">第一列：标签</tspan>
        </text>
    </g>
    <g ed:parentid="430" transform="matrix(1,0,0,1,958.58,661)" ed:height="23.75" id="559" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">第二列：文本内容</tspan>
        </text>
    </g>
    <g ed:parentid="430" transform="matrix(1,0,0,1,958.58,691.25)" ed:height="23.75" id="562" ed:width="244.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L244.7,23.8" stroke="#ff7575" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="221" x="8" style="white-space:pre" y="15.308">第三列：与上一句相关或不相关的文本</tspan>
        </text>
    </g>
    <g ed:parentid="104" transform="matrix(1,0,0,1,406.85,2814.31)" ed:height="23.75" id="637" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308" class="st6">命名实体识别NER</tspan>
        </text>
    </g>
    <g ed:parentid="637" transform="matrix(1,0,0,1,566.61,3278.5)" ed:height="23.75" id="639" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">模型训练</tspan>
        </text>
    </g>
    <g ed:parentid="637" transform="matrix(1,0,0,1,566.61,3532.38)" ed:height="41.75" id="640" ed:width="121.3333333333333">
        <path stroke-linejoin="round" d="M0,41.8L121.3,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308" class="st6">模型使用</tspan>
            <tspan textLength="102" x="8" style="white-space:pre" y="33.308">entity_extract.py</tspan>
        </text>
    </g>
    <g ed:parentid="637" transform="matrix(1,0,0,1,566.61,2166.13)" ed:height="41.75" id="641" ed:width="98.66666666666667">
        <path stroke-linejoin="round" d="M0,41.8L98.7,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="72" x="8" style="white-space:pre" y="15.308">BiLSTM模型</tspan>
            <tspan textLength="78" x="8" style="white-space:pre" y="33.308" class="st8">blistm_crf.py</tspan>
        </text>
    </g>
    <g ed:parentid="637" transform="matrix(1,0,0,1,566.61,2522.55)" ed:height="41.75" id="642" ed:width="98.66666666666667">
        <path stroke-linejoin="round" d="M0,41.8L98.7,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="50" x="8" style="white-space:pre" y="15.308">CRF模型</tspan>
            <tspan textLength="78" x="8" style="white-space:pre" y="33.308" class="st8">blistm_crf.py</tspan>
        </text>
    </g>
    <g ed:parentid="739" transform="matrix(1,0,0,1,827.48,2184.13)" ed:height="23.75" id="643" ed:width="229.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L229.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="206" x="8" style="white-space:pre" y="15.308">1.实现类的初始化和网络结构的搭建</tspan>
        </text>
    </g>
    <g ed:parentid="739" transform="matrix(1,0,0,1,827.48,2259.75)" ed:height="23.75" id="644" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">2.实现网络的前向计算</tspan>
        </text>
    </g>
    <g ed:parentid="739" transform="matrix(1,0,0,1,827.48,2305.13)" ed:height="23.75" id="645" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">3.实现网络的预测函数</tspan>
        </text>
    </g>
    <g ed:parentid="643" transform="matrix(1,0,0,1,1091.91,2184.13)" ed:height="23.75" id="646" ed:width="256">
        <path stroke-linejoin="round" d="M0,23.8L256,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="229" x="8" style="white-space:pre" y="15.308">def __init__(self,vocab_size,label_num)</tspan>
        </text>
    </g>
    <g ed:parentid="646" transform="matrix(1,0,0,1,1383.01,2153.88)" ed:height="23.75" id="647" ed:width="131.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L131.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="108" x="8" style="white-space:pre" y="15.308">定义embedding层</tspan>
        </text>
    </g>
    <g ed:parentid="646" transform="matrix(1,0,0,1,1383.01,2184.13)" ed:height="23.75" id="648" ed:width="84.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L84.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="65" x="8" style="white-space:pre" y="15.308">定义lstm层</tspan>
        </text>
    </g>
    <g ed:parentid="646" transform="matrix(1,0,0,1,1383.01,2214.38)" ed:height="23.75" id="649" ed:width="92.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L92.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="72" x="8" style="white-space:pre" y="15.308">定义linear层</tspan>
        </text>
    </g>
    <g ed:parentid="644" transform="matrix(1,0,0,1,1011.91,2259.75)" ed:height="23.75" id="650" ed:width="209.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L209.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="184" x="8" style="white-space:pre" y="15.308">def forward(self,inputs,length)</tspan>
        </text>
    </g>
    <g ed:parentid="650" transform="matrix(1,0,0,1,1256.35,2244.63)" ed:height="23.75" id="651" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">压缩和填充过程</tspan>
        </text>
    </g>
    <g ed:parentid="650" transform="matrix(1,0,0,1,1256.35,2274.88)" ed:height="23.75" id="652" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">发射分数矩阵</tspan>
        </text>
    </g>
    <g ed:parentid="645" transform="matrix(1,0,0,1,1011.91,2305.13)" ed:height="23.75" id="653" ed:width="154">
        <path stroke-linejoin="round" d="M0,23.8L154,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="131" x="8" style="white-space:pre" y="15.308">def predict(self,input)</tspan>
        </text>
    </g>
    <g ed:parentid="653" transform="matrix(1,0,0,1,1201.01,2305.13)" ed:height="23.75" id="654" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="104" x="8" style="white-space:pre" y="15.308">每次接收一个样本</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2537.75)" ed:height="23.75" id="655" ed:width="107.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L107.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="87" x="8" style="white-space:pre" y="15.308">1.构建CRF模型</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2636.06)" ed:height="23.75" id="656" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">2.计算单条路径的分数</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2741.94)" ed:height="23.75" id="657" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L149.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308">3.计算全部路径的分数</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2794.88)" ed:height="23.75" id="658" ed:width="96">
        <path stroke-linejoin="round" d="M0,23.8L96,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="76" x="8" style="white-space:pre" y="15.308">4.计算损失值</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2825.13)" ed:height="23.75" id="659" ed:width="136">
        <path stroke-linejoin="round" d="M0,23.8L136,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308">5.维特比算法的实现</tspan>
        </text>
    </g>
    <g ed:parentid="657" transform="matrix(1,0,0,1,989.25,2764.63)" ed:height="23.75" id="660" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">前向概率算法</tspan>
        </text>
    </g>
    <g ed:parentid="715" transform="matrix(1,0,0,1,804.81,2953.69)" ed:height="23.75" id="661" ed:width="189.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L189.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="167" x="8" style="white-space:pre" y="15.308">6.构造NER模型组合全部功能</tspan>
        </text>
    </g>
    <g ed:parentid="712" transform="matrix(1,0,0,1,1136.35,2537.75)" ed:height="23.75" id="662" ed:width="178.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L178.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="155" x="8" style="white-space:pre" y="15.308">def _init__(self,label_num)</tspan>
        </text>
    </g>
    <g ed:parentid="662" transform="matrix(1,0,0,1,1350.11,2522.63)" ed:height="23.75" id="663" ed:width="129.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L129.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="108" x="8" style="white-space:pre" y="15.308">定义nn.Parameter</tspan>
        </text>
    </g>
    <g ed:parentid="662" transform="matrix(1,0,0,1,1350.11,2552.88)" ed:height="23.75" id="664" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">转移分数矩阵</tspan>
        </text>
    </g>
    <g ed:parentid="656" transform="matrix(1,0,0,1,989.25,2598.25)" ed:height="23.75" id="665" ed:width="353.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L353.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="323" x="8" style="white-space:pre" y="15.308">def _get_real_path_score(self,emission,seqence_label)</tspan>
        </text>
    </g>
    <g ed:parentid="657" transform="matrix(1,0,0,1,989.25,2719.25)" ed:height="23.75" id="666" ed:width="308">
        <path stroke-linejoin="round" d="M0,23.8L308,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="281" x="8" style="white-space:pre" y="15.308">def _get_total_path_score(self,emission_score)</tspan>
        </text>
    </g>
    <g ed:parentid="665" transform="matrix(1,0,0,1,1377.68,2583.13)" ed:height="23.75" id="667" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">发射分数</tspan>
        </text>
    </g>
    <g ed:parentid="665" transform="matrix(1,0,0,1,1377.68,2613.38)" ed:height="23.75" id="668" ed:width="111.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L111.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="91" x="8" style="white-space:pre" y="15.308">状态间转移分数</tspan>
        </text>
    </g>
    <g ed:parentid="656" transform="matrix(1,0,0,1,989.25,2643.63)" ed:height="23.75" id="669" ed:width="198.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L198.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="174" x="8" style="white-space:pre" y="15.308">def _log_sum_exp(self,score)</tspan>
        </text>
    </g>
    <g ed:parentid="656" transform="matrix(1,0,0,1,989.25,2673.88)" ed:height="23.75" id="670" ed:width="326">
        <path stroke-linejoin="round" d="M0,23.8L326,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="297" x="8" style="white-space:pre" y="15.308">def _expand_emission_score(self,emission_score)</tspan>
        </text>
    </g>
    <g ed:parentid="670" transform="matrix(1,0,0,1,1350.35,2673.88)" ed:height="23.75" id="671" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">扩展发射分数</tspan>
        </text>
    </g>
    <g ed:parentid="666" transform="matrix(1,0,0,1,1332.35,2704.13)" ed:height="23.75" id="672" ed:width="388.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L388.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="360" x="8" style="white-space:pre" y="15.308">三个矩阵(前一个时刻的alpha+当前时刻的发射分数+转移分数)</tspan>
        </text>
    </g>
    <g ed:parentid="666" transform="matrix(1,0,0,1,1332.35,2734.38)" ed:height="23.75" id="673" ed:width="376">
        <path stroke-linejoin="round" d="M0,23.8L376,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="348" x="8" style="white-space:pre" y="15.308">计算log sum exp得到当前时刻每个状态之间的路径分数之和</tspan>
        </text>
    </g>
    <g ed:parentid="658" transform="matrix(1,0,0,1,935.91,2794.88)" ed:height="23.75" id="674" ed:width="327.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L327.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="297" x="8" style="white-space:pre" y="15.308">def forward(self,emission_scores,sequence_label)</tspan>
        </text>
    </g>
    <g ed:parentid="659" transform="matrix(1,0,0,1,975.91,2825.13)" ed:height="23.75" id="675" ed:width="216.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L216.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="191" x="8" style="white-space:pre" y="15.308">def predict(self,emission_score)</tspan>
        </text>
    </g>
    <g ed:parentid="713" transform="matrix(1,0,0,1,1220.35,2870.5)" ed:height="23.75" id="676" ed:width="256">
        <path stroke-linejoin="round" d="M0,23.8L256,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="229" x="8" style="white-space:pre" y="15.308">def __init__(self,vocab_size,label_num)</tspan>
        </text>
    </g>
    <g ed:parentid="661" transform="matrix(1,0,0,1,1029.25,2931)" ed:height="23.75" id="677" ed:width="248.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L248.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="221" x="8" style="white-space:pre" y="15.308">def forward(self,inputs,labels,length)</tspan>
        </text>
    </g>
    <g ed:parentid="661" transform="matrix(1,0,0,1,1029.25,2991.5)" ed:height="23.75" id="678" ed:width="160">
        <path stroke-linejoin="round" d="M0,23.8L160,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="137" x="8" style="white-space:pre" y="15.308">def predict(self,inputs)</tspan>
        </text>
    </g>
    <g ed:parentid="661" transform="matrix(1,0,0,1,1029.25,3036.88)" ed:height="23.75" id="679" ed:width="214">
        <path stroke-linejoin="round" d="M0,23.8L214,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="188" x="8" style="white-space:pre" y="15.308">def save_model(self,save_path)</tspan>
        </text>
    </g>
    <g ed:parentid="676" transform="matrix(1,0,0,1,1511.45,2855.38)" ed:height="23.75" id="680" ed:width="76.66666666666666">
        <path stroke-linejoin="round" d="M0,23.8L76.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="56" x="8" style="white-space:pre" y="15.308">self.bilsm</tspan>
        </text>
    </g>
    <g ed:parentid="676" transform="matrix(1,0,0,1,1511.45,2885.63)" ed:height="23.75" id="681" ed:width="59.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L59.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="41" x="8" style="white-space:pre" y="15.308">self.crf</tspan>
        </text>
    </g>
    <g ed:parentid="677" transform="matrix(1,0,0,1,1313.01,2915.88)" ed:height="23.75" id="682" ed:width="190">
        <path stroke-linejoin="round" d="M0,23.8L190,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="164" x="8" style="white-space:pre" y="15.308">self.bilsm(隐式调用forward)</tspan>
        </text>
    </g>
    <g ed:parentid="677" transform="matrix(1,0,0,1,1313.01,2946.13)" ed:height="23.75" id="683" ed:width="172.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L172.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="149" x="8" style="white-space:pre" y="15.308">self.crf(隐式调用forward)</tspan>
        </text>
    </g>
    <g ed:parentid="678" transform="matrix(1,0,0,1,1224.35,2976.38)" ed:height="23.75" id="684" ed:width="124.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L124.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="102" x="8" style="white-space:pre" y="15.308">self.bilsm.predict</tspan>
        </text>
    </g>
    <g ed:parentid="678" transform="matrix(1,0,0,1,1224.35,3006.63)" ed:height="23.75" id="685" ed:width="107.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L107.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="87" x="8" style="white-space:pre" y="15.308">self.crf.predict</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3067.13)" ed:height="41.75" id="686" ed:width="189.3333333333333">
        <path stroke-linejoin="round" d="M0,41.8L189.3,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="167" x="8" style="white-space:pre" y="15.308" class="st6">1.熟悉字符到数字编码的码表</tspan>
            <tspan textLength="91" x="8" style="white-space:pre" y="33.308">bulid_vocab.py</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3115.38)" ed:height="41.75" id="687" ed:width="229.3333333333333">
        <path stroke-linejoin="round" d="M0,41.8L229.3,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="206" x="8" style="white-space:pre" y="15.308" class="st6">2.熟悉训练数据集的样式和含义解释</tspan>
            <tspan textLength="92" x="8" style="white-space:pre" y="33.308">load_corpus.py</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3163.63)" ed:height="41.75" id="688" ed:width="136">
        <path stroke-linejoin="round" d="M0,41.8L136,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="115" x="8" style="white-space:pre" y="15.308" class="st6">3.生成批量训练数据</tspan>
            <tspan textLength="97" x="8" style="white-space:pre" y="33.308">encode_label.py</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3227)" ed:height="41.75" id="689" ed:width="149.3333333333333">
        <path stroke-linejoin="round" d="M0,41.8L149.3,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="128" x="8" style="white-space:pre" y="15.308" class="st6">4.完成训练模型的代码</tspan>
            <tspan textLength="46" x="8" style="white-space:pre" y="33.308">train.py</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3325.31)" ed:height="41.75" id="690" ed:width="216">
        <path stroke-linejoin="round" d="M0,41.8L216,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st7">
            <tspan textLength="193" x="8" style="white-space:pre" y="15.308" class="st6">5.完成准确率和召回率的评估代码</tspan>
            <tspan textLength="69" x="8" style="white-space:pre" y="33.308">evaluate.py</tspan>
        </text>
    </g>
    <g ed:parentid="639" transform="matrix(1,0,0,1,673.05,3471.88)" ed:height="23.75" id="691" ed:width="189.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L189.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="167" x="8" style="white-space:pre" y="15.308">6.绘制损失曲线和评估曲线图</tspan>
        </text>
    </g>
    <g ed:parentid="686" transform="matrix(1,0,0,1,897.48,3085.13)" ed:height="23.75" id="692" ed:width="128.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L128.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="105" x="8" style="white-space:pre" y="15.308">def build_vocab()</tspan>
        </text>
    </g>
    <g ed:parentid="687" transform="matrix(1,0,0,1,937.48,3133.38)" ed:height="23.75" id="693" ed:width="129.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L129.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="106" x="8" style="white-space:pre" y="15.308">def load_corpus()</tspan>
        </text>
    </g>
    <g ed:parentid="688" transform="matrix(1,0,0,1,844.15,3166.5)" ed:height="23.75" id="694" ed:width="134.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L134.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="111" x="8" style="white-space:pre" y="15.308">def encode_label()</tspan>
        </text>
    </g>
    <g ed:parentid="688" transform="matrix(1,0,0,1,844.15,3196.75)" ed:height="23.75" id="695" ed:width="203.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L203.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="183" x="8" style="white-space:pre" y="15.308">将csv文件转成DatasetDict格式</tspan>
        </text>
    </g>
    <g ed:parentid="689" transform="matrix(1,0,0,1,857.48,3229.88)" ed:height="23.75" id="696" ed:width="292">
        <path stroke-linejoin="round" d="M0,23.8L292,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="263" x="8" style="white-space:pre" y="15.308">def pad_batch_inputs(data,labels,tokenizer)</tspan>
        </text>
    </g>
    <g ed:parentid="694" transform="matrix(1,0,0,1,1013.91,3166.5)" ed:height="23.75" id="697" ed:width="274.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L274.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="247" x="8" style="white-space:pre" y="15.308">def data_handle(data_labels,data_inputs)</tspan>
        </text>
    </g>
    <g ed:parentid="689" transform="matrix(1,0,0,1,857.48,3260.13)" ed:height="23.75" id="698" ed:width="80.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L80.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="60" x="8" style="white-space:pre" y="15.308">def train()</tspan>
        </text>
    </g>
    <g ed:parentid="698" transform="matrix(1,0,0,1,973.25,3260.13)" ed:height="23.75" id="699" ed:width="322.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L322.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="294" x="8" style="white-space:pre" y="15.308">def start_train(data_inputs,data_labels,tokenizer)</tspan>
        </text>
    </g>
    <g ed:parentid="690" transform="matrix(1,0,0,1,924.15,3305.5)" ed:height="23.75" id="700" ed:width="372.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L372.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="342" x="8" style="white-space:pre" y="15.308">def evaluate(model=None,tokenizer=None,data=None)</tspan>
        </text>
    </g>
    <g ed:parentid="700" transform="matrix(1,0,0,1,1331.91,3290.38)" ed:height="23.75" id="701" ed:width="299.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L299.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="272" x="8" style="white-space:pre" y="15.308">def calculate_handler(dat_inputs,data_labels)</tspan>
        </text>
    </g>
    <g ed:parentid="700" transform="matrix(1,0,0,1,1331.91,3320.63)" ed:height="23.75" id="702" ed:width="211.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L211.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="188" x="8" style="white-space:pre" y="15.308">def start_evaluate(data_inputs)</tspan>
        </text>
    </g>
    <g ed:parentid="690" transform="matrix(1,0,0,1,924.15,3381.13)" ed:height="23.75" id="703" ed:width="228">
        <path stroke-linejoin="round" d="M0,23.8L228,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="204" x="8" style="white-space:pre" y="15.308">def extract_decode(label_list,text)</tspan>
        </text>
    </g>
    <g ed:parentid="703" transform="matrix(1,0,0,1,1187.25,3350.88)" ed:height="23.75" id="704" ed:width="288">
        <path stroke-linejoin="round" d="M0,23.8L288,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="262" x="8" style="white-space:pre" y="15.308">label_list:模型输出的包含标签序列的一维列表</tspan>
        </text>
    </g>
    <g ed:parentid="703" transform="matrix(1,0,0,1,1187.25,3381.13)" ed:height="23.75" id="705" ed:width="138">
        <path stroke-linejoin="round" d="M0,23.8L138,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="118" x="8" style="white-space:pre" y="15.308">text:模型输入的句子</tspan>
        </text>
    </g>
    <g ed:parentid="703" transform="matrix(1,0,0,1,1187.25,3411.38)" ed:height="23.75" id="706" ed:width="163.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L163.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="142" x="8" style="white-space:pre" y="15.308">return提取到的实体名字</tspan>
        </text>
    </g>
    <g ed:parentid="691" transform="matrix(1,0,0,1,897.48,3441.63)" ed:height="23.75" id="707" ed:width="178">
        <path stroke-linejoin="round" d="M0,23.8L178,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="156" x="8" style="white-space:pre" y="15.308">训练和验证召回率对照曲线</tspan>
        </text>
    </g>
    <g ed:parentid="691" transform="matrix(1,0,0,1,897.48,3471.88)" ed:height="23.75" id="708" ed:width="178">
        <path stroke-linejoin="round" d="M0,23.8L178,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="156" x="8" style="white-space:pre" y="15.308" class="st6">训练和验证精准率对照曲线</tspan>
        </text>
    </g>
    <g ed:parentid="691" transform="matrix(1,0,0,1,897.48,3502.13)" ed:height="23.75" id="709" ed:width="166.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L166.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="145" x="8" style="white-space:pre" y="15.308" class="st6">训练和验证F1值对照曲线</tspan>
        </text>
    </g>
    <g ed:parentid="640" transform="matrix(1,0,0,1,723.05,3535.25)" ed:height="23.75" id="710" ed:width="159.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L159.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="140" x="8" style="white-space:pre" y="15.308">def entity_extract(text)</tspan>
        </text>
    </g>
    <g ed:parentid="640" transform="matrix(1,0,0,1,723.05,3565.5)" ed:height="23.75" id="711" ed:width="240">
        <path stroke-linejoin="round" d="M0,23.8L240,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="218" x="8" style="white-space:pre" y="15.308">def batch_entity_extract(data_path)</tspan>
        </text>
    </g>
    <g ed:parentid="655" transform="matrix(1,0,0,1,947.25,2537.75)" ed:height="23.75" id="712" ed:width="154">
        <path stroke-linejoin="round" d="M0,23.8L154,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="131" x="8" style="white-space:pre" y="15.308">class CRF(nn.Module)</tspan>
        </text>
    </g>
    <g ed:parentid="661" transform="matrix(1,0,0,1,1029.25,2870.5)" ed:height="23.75" id="713" ed:width="156">
        <path stroke-linejoin="round" d="M0,23.8L156,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="133" x="8" style="white-space:pre" y="15.308">class NER(nn.Module)</tspan>
        </text>
    </g>
    <g ed:parentid="642" transform="matrix(1,0,0,1,700.38,2745.72)" ed:height="23.75" id="715" ed:width="69.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L69.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="50" x="8" style="white-space:pre" y="15.308" class="st6">CRF流程</tspan>
        </text>
    </g>
    <g ed:parentid="720" transform="matrix(1,0,0,1,780.15,2365.63)" ed:height="41.75" id="717" ed:width="378">
        <path stroke-linejoin="round" d="M0,41.8L378,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="284" x="8" style="white-space:pre" y="15.308">全称：Conditional Random Fields 条件随机场，</tspan>
            <tspan textLength="351" x="8" style="white-space:pre" y="33.308">在给定输入序列的条件下，求解输出序列的条件概率分布模型</tspan>
        </text>
    </g>
    <g ed:parentid="719" transform="matrix(1,0,0,1,780.15,2335.38)" ed:height="23.75" id="718" ed:width="311.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L311.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="286" x="8" style="white-space:pre" y="15.308">增加了先验条件，可以更好的完成实体序列的识别</tspan>
        </text>
    </g>
    <g ed:parentid="642" transform="matrix(1,0,0,1,700.38,2335.38)" ed:height="23.75" id="719" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">作用</tspan>
        </text>
    </g>
    <g ed:parentid="642" transform="matrix(1,0,0,1,700.38,2383.63)" ed:height="23.75" id="720" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">介绍</tspan>
        </text>
    </g>
    <g ed:parentid="727" transform="matrix(1,0,0,1,780.15,2413.88)" ed:height="23.75" id="725" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">转移概率矩阵</tspan>
        </text>
    </g>
    <g ed:parentid="725" transform="matrix(1,0,0,1,913.25,2413.88)" ed:height="23.75" id="726" ed:width="284.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L284.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="260" x="8" style="white-space:pre" y="15.308">通过训练学习得到不同状态间互相转换的概率</tspan>
        </text>
    </g>
    <g ed:parentid="642" transform="matrix(1,0,0,1,700.38,2453.13)" ed:height="23.75" id="727" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">原理</tspan>
        </text>
    </g>
    <g ed:parentid="727" transform="matrix(1,0,0,1,780.15,2462.13)" ed:height="23.75" id="728" ed:width="98">
        <path stroke-linejoin="round" d="M0,23.8L98,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="78" x="8" style="white-space:pre" y="15.308">发射概率矩阵</tspan>
        </text>
    </g>
    <g ed:parentid="728" transform="matrix(1,0,0,1,913.25,2444.13)" ed:height="41.75" id="729" ed:width="338">
        <path stroke-linejoin="round" d="M0,41.8L338,41.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="312" x="8" style="white-space:pre" y="15.308">将一句话中每个字映射到不同状态的分数构成的矩阵，</tspan>
            <tspan textLength="208" x="8" style="white-space:pre" y="33.308">通过神经网络中最后一层线性层输出</tspan>
        </text>
    </g>
    <g ed:parentid="731" transform="matrix(1,0,0,1,886.58,2492.38)" ed:height="23.75" id="730" ed:width="164.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L164.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="143" x="8" style="white-space:pre" y="15.308">计算得到概率最大的路径</tspan>
        </text>
    </g>
    <g ed:parentid="727" transform="matrix(1,0,0,1,780.15,2492.38)" ed:height="23.75" id="731" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">损失函数</tspan>
        </text>
    </g>
    <g ed:parentid="641" transform="matrix(1,0,0,1,700.38,2244.63)" ed:height="23.75" id="739" ed:width="92">
        <path stroke-linejoin="round" d="M0,23.8L92,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st5">
            <tspan textLength="72" x="8" style="white-space:pre" y="15.308" class="st6">BiLSTM流程</tspan>
        </text>
    </g>
    <g ed:parentid="744" transform="matrix(1,0,0,1,752.81,2063.13)" ed:height="23.75" id="741" ed:width="364.6666666666667">
        <path stroke-linejoin="round" d="M0,23.8L364.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="338" x="8" style="white-space:pre" y="15.308">适用于有特殊上下文的实体，或实体本身有很多特征的文本</tspan>
        </text>
    </g>
    <g ed:parentid="743" transform="matrix(1,0,0,1,752.81,2093.38)" ed:height="23.75" id="742" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">序列标注</tspan>
        </text>
    </g>
    <g ed:parentid="745" transform="matrix(1,0,0,1,646.38,2093.38)" ed:height="23.75" id="743" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">基于模型</tspan>
        </text>
    </g>
    <g ed:parentid="745" transform="matrix(1,0,0,1,646.38,2063.13)" ed:height="23.75" id="744" ed:width="71.33333333333334">
        <path stroke-linejoin="round" d="M0,23.8L71.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="52" x="8" style="white-space:pre" y="15.308">基于规则</tspan>
        </text>
    </g>
    <g ed:parentid="637" transform="matrix(1,0,0,1,566.61,2078.25)" ed:height="23.75" id="745" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">方法</tspan>
        </text>
    </g>
    <g ed:parentid="752" transform="matrix(1,0,0,1,780.15,2123.63)" ed:height="23.75" id="751" ed:width="253.3333333333333">
        <path stroke-linejoin="round" d="M0,23.8L253.3,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="230" x="8" style="white-space:pre" y="15.308">双向的LSTM，同时捕捉正向和反向信息</tspan>
        </text>
    </g>
    <g ed:parentid="641" transform="matrix(1,0,0,1,700.38,2123.63)" ed:height="23.75" id="752" ed:width="44.66666666666667">
        <path stroke-linejoin="round" d="M0,23.8L44.7,23.8" stroke="#5fb7f1" fill="none" stroke-width="2"/>
        <text class="st4">
            <tspan textLength="26" x="8" style="white-space:pre" y="15.308">介绍</tspan>
        </text>
    </g>
</svg>
</div>
        <div id="copyright">Created With  <a href="https://www.edrawsoft.com/" target="_blank" title="edrawsoft">MindMaster</a></div>
      </div>
    </div>
    <script>eval(atob('dmFyIG11YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Ow0KdmFyIHVhID0gKG11YS5pbmRleE9mKCdydjoxMScpICsgbXVhLmluZGV4T2YoJ01TSUUnKSkgPj0gMDsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmctY29udGFpbmVyJykub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uIChldmVudCkgew0KICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQp9DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZnLWNvbnRhaW5lcicpLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgaWYgKGV2ZW50LndoaWNoID09IDMpIHsNCiAgICAgICAgdGhpcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQogICAgICAgIHRoaXMub25tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXYpIHsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQnkoLShldi5tb3ZlbWVudFgpLCAwKTsNCiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCAtKGV2Lm1vdmVtZW50WSkpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5vbm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmN1cnNvciA9IG51bGw7DQogICAgICAgICAgICB0aGlzLm9ubW91c2V1cCA9IG51bGw7DQogICAgICAgICAgICB0aGlzLm9ubW91c2Vtb3ZlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCk51bWJlci5wcm90b3R5cGUudG9zdWl0c3ZnID0gZnVuY3Rpb24gKCkgew0KICAgIHZhciBudW0gPSB0aGlzLnZhbHVlT2YoKTsNCiAgICBpZiAobnVtICUgMSA9PT0gMCkgew0KICAgICAgICByZXR1cm4gbnVtICsgMC41DQogICAgfSBlbHNlIHJldHVybiBudW07DQp9Ow0KTnVtYmVyLnByb3RvdHlwZS5wbHVzeiA9IGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbnVtID0gdGhpcy52YWx1ZU9mKCk7DQogICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtOw0KfTsNCmZ1bmN0aW9uIHBhcnNlRGF0ZShudW0pIHsNCiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKG51bSk7DQogICAgdmFyIFkgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyAnLSc7DQogICAgdmFyIE0gPSAoZGF0ZS5nZXRNb250aCgpICsgMSkucGx1c3ooKSArICctJzsNCiAgICB2YXIgRCA9IGRhdGUuZ2V0RGF0ZSgpLnBsdXN6KCkgKyAnICc7DQogICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCkucGx1c3ooKSArICc6JzsNCiAgICB2YXIgbW0gPSBkYXRlLmdldE1pbnV0ZXMoKS5wbHVzeigpICsgJzonOw0KICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCkucGx1c3ooKTsNCiAgICByZXR1cm4gWSArIE0gKyBEICsgaCArIG1tICsgczsNCn0NCi8vLS1wcmVkZWZpbmVkDQovL2NvbW1lbnQtLQ0KDQpmdW5jdGlvbiBnZXRjd2gocG9wdXApIHsNCiAgICBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKVswXS5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgdmFyIHcgPSBwb3B1cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICB2YXIgaCA9IHBvcHVwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsNCiAgICByZXR1cm4gW3csIGhdDQp9DQpzdmdFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN2ZyIpOw0KZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBzdmdFbGVtcy5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAvLyB2YXIgY29tbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdmc6bnRoLWNoaWxkKCcgKyBpbmRleCArICcpIGc+Z1tlZFxcOmNvbW1lbnRdJyk7DQogICAgdmFyIGNvbW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgc3ZnOm50aC1jaGlsZCgke2luZGV4fSkgZz5nW2VkXFw6Y29tbWVudF1gKTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpOw0KICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgIHZhciBob3ZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICB2YXIgb2xpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCdmaWxsJywgJyNjZGNkZmYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd4JywgJzAnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd5JywgJzAnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBjb21tZW50c1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpKTsNCiAgICAgICAgaG92ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgY29tbWVudHNbaV0uYXBwZW5kQ2hpbGQoaG92ZXIpOw0KICAgICAgICB2YXIgYSA9IEpTT04ucGFyc2UoY29tbWVudHNbaV0uZ2V0QXR0cmlidXRlKCdlZDpjb21tZW50JykpOw0KICAgICAgICB2YXIgaGVpZ2h0ID0gMDsNCiAgICAgICAgdmFyIGNhcnIgPSBbXTsNCiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICB2YXIgc3RhbXAgPSBOdW1iZXIoYVtqXS5EYXRlKSAqIDEwMDA7DQogICAgICAgICAgICB2YXIgdGltZSA9IHBhcnNlRGF0ZShzdGFtcCk7DQogICAgICAgICAgICB2YXIgbmFtZSA9IGFbal0uTmFtZTsNCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gYVtqXS5NZXNzYWdlOw0KICAgICAgICAgICAgdmFyIG1lc3NhZ2VBcnIgPSBtZXNzYWdlLnNwbGl0KC9cbi8pOw0KICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTsNCiAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICd0ZXh0Jyk7DQogICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndGV4dCcpOw0KICAgICAgICAgICAgdmFyIG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCd4JywgNSk7DQogICAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgneScsIDEyKTsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCdmaWxsJywgJyMwMDZlZmYnKTsNCiAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSBuYW1lICsgJzogJzsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCAnMTInKTsNCiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKCd4JywgMjAwKTsNCiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKCd5JywgMTIpOw0KICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnIzk2OTY5NicpOw0KICAgICAgICAgICAgdC50ZXh0Q29udGVudCA9IHRpbWU7DQogICAgICAgICAgICB0LnNldEF0dHJpYnV0ZSgnZm9udC1zaXplJywgJzEwJyk7DQogICAgICAgICAgICBtLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgyMCwyNyknKTsNCiAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCAnMTInKTsNCiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWVzc2FnZUFyci5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgIHZhciB0cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndHNwYW4nKTsNCiAgICAgICAgICAgICAgICB0cy5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICAgICAgICAgIHRzLnNldEF0dHJpYnV0ZSgneScsIGsgKiAxNik7DQogICAgICAgICAgICAgICAgdHMudGV4dENvbnRlbnQgPSBtZXNzYWdlQXJyW2tdOw0KICAgICAgICAgICAgICAgIG0uYXBwZW5kQ2hpbGQodHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgby5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKTsNCiAgICAgICAgICAgIG8uYXBwZW5kQ2hpbGQobik7DQogICAgICAgICAgICBvLmFwcGVuZENoaWxkKHQpOw0KICAgICAgICAgICAgby5hcHBlbmRDaGlsZChtKTsNCiAgICAgICAgICAgIGNhcnIucHVzaChvKTsNCiAgICAgICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG8pOw0KICAgICAgICAgICAgaGVpZ2h0ID0gKG1lc3NhZ2VBcnIubGVuZ3RoICsgMSkgKiAxNiArIGhlaWdodDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgd2FyciA9IGdldGN3aChwb3B1cCk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneCcsICcwJyk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneScsICcwJyk7DQogICAgICAgIHZhciBvdyA9IHdhcnJbMF0gKyAxMC41Ow0KICAgICAgICB2YXIgb2ggPSB3YXJyWzFdICsgMzsNCiAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIG93KTsNCiAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBvaCk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd3aGl0ZScpOw0KICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjNjU2NTY1Jyk7DQogICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG9saW5lKTsNCiAgICAgICAgdmFyIGwgPSBjYXJyLmxlbmd0aDsNCiAgICAgICAgd2hpbGUgKGwtLSkgew0KICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQoY2FycltsXSk7DQogICAgICAgIH0NCiAgICAgICAgcG9wdXAub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9Ow0KICAgICAgICBwb3B1cC5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICB9Ow0KICAgICAgICB2YXIgY3MgPSBjb21tZW50c1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLm1hdGNoKC9cKChcUyp8XFMqXHNcUyopXCkvKVsxXS5zcGxpdCgvIHwsLyk7DQogICAgICAgIHZhciBwcyA9IGNvbW1lbnRzW2ldLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsNCiAgICAgICAgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAndHInKSB7DQogICAgICAgICAgICB2YXIgcHBzID0gcHMubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyBwYXJzZUZsb2F0KHBwc1swXSk7DQogICAgICAgICAgICB2YXIgeSA9IHBhcnNlRmxvYXQocHBzWzFdKTsNCiAgICAgICAgICAgIHggPSB4LnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgeSA9IHkudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyB4ICsgJywnICsgeSArICcpJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChwcy5zdWJzdHIoMCwgMikgPT0gJ21hJykgew0KICAgICAgICAgICAgdmFyIHBwcyA9IHBzLm1hdGNoKC8oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pXCkkLyk7DQogICAgICAgICAgICB2YXIgbWFBcnIgPSBbcGFyc2VGbG9hdChwcHNbMV0pLCBwYXJzZUZsb2F0KHBwc1szXSksIHBhcnNlRmxvYXQocHBzWzVdKSwgcGFyc2VGbG9hdChwcHNbN10pLCBwYXJzZUZsb2F0KHBwc1s5XSksIHBhcnNlRmxvYXQocHBzWzExXSldOw0KICAgICAgICAgICAgaWYgKG1hQXJyWzFdID09IDApIHsNCiAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pOw0KICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB2YXIgeDEgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB4MSA9IHgxLnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgICAgIHkxID0geTEudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeDEgKyAnLCcgKyB5MSArICcpJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB2YXIgeDEgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB5ID0gcGFyc2VGbG9hdChjc1sxXSk7DQogICAgICAgICAgICAgICAgdmFyIHgyID0geCAqIG1hQXJyWzBdICsgeSAqIG1hQXJyWzJdICsgbWFBcnJbNF07DQogICAgICAgICAgICAgICAgdmFyIHkyID0geCAqIG1hQXJyWzFdICsgeSAqIG1hQXJyWzNdICsgbWFBcnJbNV07DQogICAgICAgICAgICAgICAgdmFyIGZ4ID0geDEgPCB4MiA/IHgxLnRvc3VpdHN2ZygpIDogeDIudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIGZ5ID0geTEgPiB5MiA/IHkxLnRvc3VpdHN2ZygpIDogeTIudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIG9mZnkgPSBNYXRoLmFicyh5MSAtIHkyKTsNCiAgICAgICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyBmeCArICcsJyArIGZ5ICsgJyknOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIG9mZnkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTYnKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCd5JywgKC1vZmZ5KS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCdmaWxsJywgJ3RyYW5zcGFyZW50Jyk7DQogICAgICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQocG9wdXBSKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIHRyc3RyKTsNCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdjb21tZW50JywgJycpOw0KICAgICAgICBwb3B1cC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBsZXQgY29tbWVudGlkID0gY29tbWVudHNbaV0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmlkICsgIiwiICsgY29tbWVudHNbaV0ucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdlZDpjb21tZW50aWQnLCBjb21tZW50aWQpOw0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZzpudGgtY2hpbGQoJyArIGluZGV4ICsgJyknKS5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgICAgIGNvbW1lbnRzW2ldLm9ubW91c2VvdmVyID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy8gdmFyIGNvbW1lbnRpZCA9IHRoaXMucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcigncmVjdCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmNvbW1lbnRpZD0nIiArIGNvbW1lbnRpZCArICInXVtjb21tZW50XSIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9Ow0KICAgICAgICBjb21tZW50c1tpXS5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy8gdmFyIGNvbW1lbnRpZCA9IHRoaXMucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIC8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmNvbW1lbnRpZD0nIiArIGNvbW1lbnRpZCArICInXVtjb21tZW50XSIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICB9DQp9DQovLy0tY29tbWVudA0KLy9ub3RlLS0NCmlmICghdWEpIHsNCiAgICBmdW5jdGlvbiBnZXR3aChzLCBwKSB7DQogICAgICAgIHZhciBtYWlucCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBtYWlucC5zdHlsZS5jc3NUZXh0ID0gczsNCiAgICAgICAgbWFpbnAuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOw0KICAgICAgICBtYWlucC5zdHlsZS5tYXhXaWR0aCA9ICc0MDBweCc7DQogICAgICAgIG1haW5wLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnOw0KICAgICAgICBtYWlucC5pbm5lckhUTUwgPSBwOw0KICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1haW5wKTsNCiAgICAgICAgLy8gdmFyIHcgPSBtYWlucC5jbGllbnRXaWR0aDsNCiAgICAgICAgLy8gdmFyIGggPSBtYWlucC5jbGllbnRIZWlnaHQ7DQogICAgICAgIGxldCB7IHdpZHRoLGhlaWdodCB9ID0gbWFpbnAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgICAgIHZhciB3ID0gTWF0aC5jZWlsKHdpZHRoKQ0KICAgICAgICB2YXIgaCA9IE1hdGguY2VpbChoZWlnaHQpDQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWFpbnApOw0KICAgICAgICByZXR1cm4gW3csIGhdDQogICAgfQ0KICAgIHN2Z0VsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgic3ZnIik7DQogICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBzdmdFbGVtcy5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAgICAgdmFyIG5vdGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3ZnOm50aC1jaGlsZCgnICsgaW5kZXggKyAnKSBnPmdbZWRcXDpub3RlXScpOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgYSA9IG5vdGVzW2ldLmdldEF0dHJpYnV0ZSgnZWQ6bm90ZScpOw0KICAgICAgICAgICAgdmFyIG5vdGVMb2NrID0gbm90ZXNbaV0uZ2V0QXR0cmlidXRlKCdlZDpub3RlbG9jaycpOw0KICAgICAgICAgICAgaWYgKG5vdGVMb2NrID09ICd0cnVlJykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1haW5wID0gYS5tYXRjaCgvPGJvZHlbXj5dKj4oLiopPFwvYm9keT4vKVsxXTsNCiAgICAgICAgICAgIHZhciBtYWlucyA9IGEubWF0Y2goL3N0eWxlPSIoLio/KSIvKVsxXTsNCiAgICAgICAgICAgIHZhciBvdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTsNCiAgICAgICAgICAgIHZhciBvbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICAgICAgdmFyIHBvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdmb3JlaWduT2JqZWN0Jyk7DQogICAgICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgICAgICB2YXIgaG92ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjY2RjZGZmJyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd5JywgJzAnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzE2Jyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzE2Jyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjYnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgbm90ZXNbaV0ucXVlcnlTZWxlY3RvcigndXNlJykuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSk7DQogICAgICAgICAgICBob3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgbm90ZXNbaV0uYXBwZW5kQ2hpbGQoaG92ZXIpOw0KICAgICAgICAgICAgcG9wdXAuc3R5bGUuY3NzVGV4dCA9IG1haW5zOw0KICAgICAgICAgICAgcG9wdXAuaW5uZXJIVE1MID0gbWFpbnA7DQogICAgICAgICAgICB2YXIgd2ggPSBnZXR3aChtYWlucywgbWFpbnApOw0KICAgICAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdoWzBdKTsNCiAgICAgICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgd2hbMV0pOw0KICAgICAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDgsNCknKTsNCiAgICAgICAgICAgIHBvcHVwLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnOw0KICAgICAgICAgICAgcG9wdXAuc3R5bGUudGV4dEFsaWduID0gJ2xlZnQnOw0KICAgICAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCd4JywgJzAnKTsNCiAgICAgICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneScsICcwJyk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2hbMF0gKyAxNik7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHdoWzFdICsgOCk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjYTI3YTAwJyk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2ZmZTc5ZCcpOw0KICAgICAgICAgICAgb3V0LmFwcGVuZENoaWxkKG9saW5lKTsNCiAgICAgICAgICAgIG91dC5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgICAgICAgICBvdXQuc2V0QXR0cmlidXRlKCdub3RlJywgJycpOw0KICAgICAgICAgICAgb3V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICBsZXQgbm90ZWlkID0gbm90ZXNbaV0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmlkICsgIiwiICsgbm90ZXNbaV0ucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIG91dC5zZXRBdHRyaWJ1dGUoJ2VkOm5vdGVpZCcsIG5vdGVpZCk7DQogICAgICAgICAgICBvdXQub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBvdXQub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbiA/IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVSYW5nZSh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmUpOmRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHZhciBjcyA9IG5vdGVzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgICAgIHZhciBwcyA9IG5vdGVzW2ldLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsNCiAgICAgICAgICAgIGlmIChwcy5zdWJzdHIoMCwgMikgPT0gJ3RyJykgew0KICAgICAgICAgICAgICAgIHZhciBwcHMgPSBwcy5tYXRjaCgvXCgoXFMqfFxTKlxzXFMqKVwpLylbMV0uc3BsaXQoLyB8LC8pOw0KICAgICAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyBwYXJzZUZsb2F0KHBwc1swXSk7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KHBwc1sxXSk7DQogICAgICAgICAgICAgICAgeCA9IHgudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgeSA9IHkudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeCArICcsJyArIHkgKyAnKSc7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAnbWEnKSB7DQogICAgICAgICAgICAgICAgdmFyIHBwcyA9IHBzLm1hdGNoKC8oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pXCkkLyk7DQogICAgICAgICAgICAgICAgdmFyIG1hQXJyID0gW3BhcnNlRmxvYXQocHBzWzFdKSwgcGFyc2VGbG9hdChwcHNbM10pLCBwYXJzZUZsb2F0KHBwc1s1XSksIHBhcnNlRmxvYXQocHBzWzddKSwgcGFyc2VGbG9hdChwcHNbOV0pLCBwYXJzZUZsb2F0KHBwc1sxMV0pXTsNCiAgICAgICAgICAgICAgICBpZiAobWFBcnJbMV0gPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IHBhcnNlRmxvYXQoY3NbMV0pICsgMTY7DQogICAgICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICAgICAgeDEgPSB4MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgeTEgPSB5MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeDEgKyAnLCcgKyB5MSArICcpJzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pICsgMTY7DQogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0geCAqIG1hQXJyWzBdICsgeSAqIG1hQXJyWzJdICsgbWFBcnJbNF07DQogICAgICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgICAgICB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyAxNjsNCiAgICAgICAgICAgICAgICAgICAgeSA9IHBhcnNlRmxvYXQoY3NbMV0pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeDIgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHkyID0geCAqIG1hQXJyWzFdICsgeSAqIG1hQXJyWzNdICsgbWFBcnJbNV07DQogICAgICAgICAgICAgICAgICAgIHZhciBmeCA9IHgxIDwgeDIgPyB4MS50b3N1aXRzdmcoKSA6IHgyLnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZnkgPSB5MSA+IHkyID8geTEudG9zdWl0c3ZnKCkgOiB5Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnkgPSBNYXRoLmFicyh5MSAtIHkyKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgZnggKyAnLCcgKyBmeSArICcpJzsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgb2ZmeS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTYnKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgneScsICgtb2ZmeSkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAndHJhbnNwYXJlbnQnKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQocG9wdXBSKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXQuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCB0cnN0cik7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZzpudGgtY2hpbGQoJyArIGluZGV4ICsgJyknKS5hcHBlbmRDaGlsZChvdXQpOw0KICAgICAgICAgICAgbm90ZXNbaV0ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgLy8gdmFyIG5vdGVpZCA9IG5vdGVpZDsNCiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6bm90ZWlkPSciICsgbm90ZWlkICsgIiddW25vdGVdIikuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgbm90ZXNbaV0ub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAvLyB2YXIgbm90ZWlkID0gbm90ZWlkOw0KICAgICAgICAgICAgICAgIC8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7DQogICAgICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6bm90ZWlkPSciICsgbm90ZWlkICsgIiddW25vdGVdIikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0gZWxzZSB7DQogICAgY29uc29sZS5sb2coJ+aKseatie+8jElF5rWP6KeI5Zmo5LiN5pSv5oyBbm90Zeino+aekO+8jOivt+S9v+eUqOWFtuS7luWGheaguOa1j+iniOWZqOOAguiwouiwou+8gScpDQp9DQovLy0tbm90ZQ0KLy9oeXBlcmxpbmstLQ0KZnVuY3Rpb24gZ2V0bWF4bGVuKGFyciwgYnJyKSB7DQogICAgdmFyIGwgPSAwOw0KICAgIHZhciBsbCA9IDA7DQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnIubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgaWYgKCFpc05hTihsaW5rYXJyW2pdKSkgew0KICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9ICdQYWdlLScgKyBhcnJbal07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlLnRleHRDb250ZW50ID0gYXJyW2pdOw0KICAgICAgICB9DQogICAgICAgIGUuc3R5bGUuZm9udFNpemUgPSAnMTJweCc7DQogICAgICAgIGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N2ZycpWzBdLmFwcGVuZENoaWxkKGUpOw0KICAgICAgICB2YXIgZXcgPSBlLmdldEJCb3goKS53aWR0aDsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0ucmVtb3ZlQ2hpbGQoZSk7DQogICAgICAgIHZhciBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICd0ZXh0Jyk7DQogICAgICAgIGgudGV4dENvbnRlbnQgPSBicnJbal07DQogICAgICAgIGguc3R5bGUuZm9udFNpemUgPSAnMTJweCc7DQogICAgICAgIGguc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJzsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0uYXBwZW5kQ2hpbGQoaCk7DQogICAgICAgIHZhciBodyA9IGguZ2V0QkJveCgpLndpZHRoOw0KICAgICAgICBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKVswXS5yZW1vdmVDaGlsZChoKTsNCiAgICAgICAgbCA9IGV3ID4gaHcgPyBldyA6IGh3Ow0KICAgICAgICBsbCA9IGwgPiBsbCA/IGwgOiBsbDsNCiAgICB9DQogICAgcmV0dXJuIGxsOw0KfQ0Kc3ZnRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdmciKTsNCmZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPD0gc3ZnRWxlbXMubGVuZ3RoOyBpbmRleCsrKSB7DQogICAgbGV0IHN2Z0VsZW0gPSBzdmdFbGVtc1tpbmRleF07DQogICAgbGV0IGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgic3ZnOm50aC1jaGlsZCgiICsgaW5kZXggKyAiKSBnPmdbZWRcXDpoeXBlcmxpbmtdIikNCiAgICBjb25zb2xlLmxvZyhsaW5rcyk7DQogICAgLy8gdmFyIGxpbmtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2c+Z1tlZFxcOmh5cGVybGlua10nKTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpOw0KICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgIHZhciBob3ZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICB2YXIgZGVzY2FyciA9IFtdOw0KICAgICAgICB2YXIgbGlua2FyciA9IFtdOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2NkY2RmZicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3knLCAnMCcpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzE2Jyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGxpbmtzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykpOw0KICAgICAgICBob3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBsaW5rc1tpXS5hcHBlbmRDaGlsZChob3Zlcik7DQogICAgICAgIC8vIGNvbnNvbGUubG9nKGxpbmtzW2ldLmdldEF0dHJpYnV0ZSgnZWQ6aHlwZXJsaW5rJykpOw0KICAgICAgICB2YXIgYSA9IEpTT04ucGFyc2UobGlua3NbaV0uZ2V0QXR0cmlidXRlKCdlZDpoeXBlcmxpbmsnKSk7DQogICAgICAgIHZhciBjcyA9IGxpbmtzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgdmFyIHBzID0gbGlua3NbaV0ucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpOw0KICAgICAgICBpZiAocHMuc3Vic3RyKDAsIDIpID09ICd0cicpIHsNCiAgICAgICAgICAgIHZhciBwcHMgPSBwcy5tYXRjaCgvXCgoXFMqfFxTKlxzXFMqKVwpLylbMV0uc3BsaXQoLyB8LC8pOw0KICAgICAgICAgICAgdmFyIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIHBhcnNlRmxvYXQocHBzWzBdKTsNCiAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChwcHNbMV0pOw0KICAgICAgICAgICAgeCA9IHgudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICB5ID0geS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgIHZhciB0cnN0ciA9ICd0cmFuc2xhdGUoJyArIHggKyAnLCcgKyB5ICsgJyknOw0KICAgICAgICB9IGVsc2UgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAnbWEnKSB7DQogICAgICAgICAgICB2YXIgcHBzID0gcHMubWF0Y2goLyhcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylcKSQvKTsNCiAgICAgICAgICAgIHZhciBtYUFyciA9IFtwYXJzZUZsb2F0KHBwc1sxXSksIHBhcnNlRmxvYXQocHBzWzNdKSwgcGFyc2VGbG9hdChwcHNbNV0pLCBwYXJzZUZsb2F0KHBwc1s3XSksIHBhcnNlRmxvYXQocHBzWzldKSwgcGFyc2VGbG9hdChwcHNbMTFdKV07DQogICAgICAgICAgICBpZiAobWFBcnJbMV0gPT0gMCkgew0KICAgICAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSk7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KGNzWzFdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgIHgxID0geDEudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgeTEgPSB5MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyB4MSArICcsJyArIHkxICsgJyknOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pICsgMTY7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KGNzWzFdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHkgPSBwYXJzZUZsb2F0KGNzWzFdKTsNCiAgICAgICAgICAgICAgICB2YXIgeDIgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTIgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB2YXIgZnggPSB4MSA8IHgyID8geDEudG9zdWl0c3ZnKCkgOiB4Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgZnkgPSB5MSA+IHkyID8geTEudG9zdWl0c3ZnKCkgOiB5Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgb2ZmeSA9IE1hdGguYWJzKHkxIC0geTIpOw0KICAgICAgICAgICAgICAgIHZhciB0cnN0ciA9ICd0cmFuc2xhdGUoJyArIGZ4ICsgJywnICsgZnkgKyAnKSc7DQogICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgb2ZmeS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxNicpOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ3knLCAoLW9mZnkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAndHJhbnNwYXJlbnQnKTsNCiAgICAgICAgICAgICAgICBwb3B1cC5hcHBlbmRDaGlsZChwb3B1cFIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBhbCA9IGEubGVuZ3RoOw0KICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsOyBqKyspIHsNCiAgICAgICAgICAgIGxpbmthcnIucHVzaChhW2pdLmxpbmspOw0KICAgICAgICAgICAgZGVzY2Fyci5wdXNoKGFbal0uZGVzYyk7DQogICAgICAgIH0NCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCB0cnN0cik7DQogICAgICAgIHZhciBtYXggPSBnZXRtYXhsZW4obGlua2FyciwgZGVzY2Fycik7DQogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYWw7IGsrKykgew0KICAgICAgICAgICAgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2EnKTsNCiAgICAgICAgICAgIHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndGV4dCcpOw0KICAgICAgICAgICAgdmFyIGYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgICAgIGlmIChpc05hTihsaW5rYXJyW2tdKSkgew0KICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgInhsaW5rIiwgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiKTsNCiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwgImhyZWYiLCBsaW5rYXJyW2tdKTsNCiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpOw0KICAgICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBsaW5rYXJyW2tdOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlLnRleHRDb250ZW50ID0gJ1BhZ2UtJyArIGxpbmthcnJba107DQogICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAieGxpbmsiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIpOw0KICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCAiaHJlZiIsICIjIiArIGxpbmthcnJba10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgbWF4ICsgMTApOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICczMycpOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjOTk5OTk5Jyk7DQogICAgICAgICAgICBkLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd3aGl0ZScpOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3knLCAzMyAqIGspOw0KICAgICAgICAgICAgZi50ZXh0Q29udGVudCA9IGRlc2NhcnJba107DQogICAgICAgICAgICBmLnN0eWxlLmZvbnRTaXplID0gJzEycHgnOw0KICAgICAgICAgICAgZi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnOw0KICAgICAgICAgICAgZi5zZXRBdHRyaWJ1dGUoJ3gnLCA1KTsNCiAgICAgICAgICAgIGYuc2V0QXR0cmlidXRlKCd5JywgMzMgKiBrICsgMTIpOw0KICAgICAgICAgICAgZS5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JzsNCiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywgMzMgKiBrICsgMjgpOw0KICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCA1KTsNCiAgICAgICAgICAgIGMuYXBwZW5kQ2hpbGQoZCk7DQogICAgICAgICAgICBjLmFwcGVuZENoaWxkKGYpOw0KICAgICAgICAgICAgYy5hcHBlbmRDaGlsZChlKTsNCiAgICAgICAgICAgIGMub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZmlsbCA9ICcjZTFlMWZmJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGMub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5maWxsID0gJ3doaXRlJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKGMpOw0KICAgICAgICB9DQogICAgICAgIHBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaHlwZXJsaW5rJywgJycpOw0KICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ2VkOmxpbmtpZCcsIGxpbmtzW2ldLnBhcmVudE5vZGUucGFyZW50Tm9kZS5pZCArICIsIiArIGxpbmtzW2ldLnBhcmVudE5vZGUuaWQpOw0KICAgICAgICBwb3B1cC5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIH07DQogICAgICAgIHBvcHVwLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH07DQogICAgICAgIHBvcHVwLm9ubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH07DQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdmctY29udGFpbmVyID4gc3ZnOm50aC1jaGlsZCgnICsgaW5kZXggKyAnKScpLmFwcGVuZENoaWxkKHBvcHVwKTsNCiAgICAgICAgbGlua3NbaV0ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgbGlua2lkID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUuaWQgKyAiLCIgKyB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDpsaW5raWQ9JyIgKyBsaW5raWQgKyAiJ11baHlwZXJsaW5rXSIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAgICAgLy8gcG9wdXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIH0NCiAgICAgICAgbGlua3NbaV0ub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIC8vIHZhciBsaW5raWQgPSB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB2YXIgbGlua2lkID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUuaWQgKyAiLCIgKyB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmxpbmtpZD0nIiArIGxpbmtpZCArICInXVtoeXBlcmxpbmtdIikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIC8vIHBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8vLS1oeXBlcmxpbmsNCi8vaW5pdGlhbGl6ZS0tDQp2YXIgc2hhcGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdnW2VkXFw6dG9ndG9waWNpZF0nKTsNCnZhciBtSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdnW2VkXFw6dG9waWN0eXBlXScpOw0KdmFyIGRhdGFUcmVlID0ge307DQp2YXIgZXh0cmFSZWxhID0ge307DQp2YXIgY2hlY2tJRCA9ICcnOw0KZm9yICh2YXIgaSA9IDA7IGkgPCBtSWQubGVuZ3RoOyBpKyspIHsNCiAgICB2YXIgdHlwZSA9IG1JZFtpXS5nZXRBdHRyaWJ1dGUoJ2VkOnRvcGljdHlwZScpOw0KICAgIHZhciBzaWQgPSBtSWRbaV0uaWQ7DQogICAgaWYgKHR5cGUgIT09ICdjYWxsb3V0Jykgew0KICAgICAgICBpbml0KHNpZCwgZGF0YVRyZWUpDQogICAgfQ0KfQ0KZnVuY3Rpb24gaW5pdChpZCwgb2JqKSB7DQogICAgdmFyIGNoaWxkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpwYXJlbnRpZD0nIiArIGlkICsgIiddOm5vdChbZWRcXDp0b3BpY3R5cGVdKSIpOw0KICAgIHZhciBjYWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpwYXJlbnRpZD0nIiArIGlkICsgIiddW2VkXFw6dG9waWN0eXBlXSIpOw0KICAgIHZhciBzdW1tYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicGF0aFtlZFxcOnBhcmVudGlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0nc3VtbWFyeSddIik7DQogICAgdmFyIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicGF0aFtlZFxcOnBhcmVudGlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0nYm91bmRhcnknXSIpOw0KICAgIHZhciByZWxhZnJvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpmcm9taWQqPSciICsgaWQgKyAiJ11bZWRcXDp0eXBlPSdyZWxhdGlvbiddIik7DQogICAgdmFyIHJlbGF0byA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDp0b2lkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0ncmVsYXRpb24nXSIpOw0KICAgIG9ialsibSIgKyBpZF0gPSB7fTsNCiAgICB2YXIgdHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOnRvcGljdHlwZScpOw0KICAgIHZhciBpdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOndpZHRoJyk7DQogICAgdmFyIGloID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmdldEF0dHJpYnV0ZSgnZWQ6aGVpZ2h0Jyk7DQogICAgaWYgKHR5cGUpIHsNCiAgICAgICAgb2JqWyJtIiArIGlkXS50eXBlID0gdHlwZTsNCiAgICB9DQogICAgaWYgKGl3ICYmIGloKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0ud2lkdGggPSBpdzsNCiAgICAgICAgb2JqWyJtIiArIGlkXS5oZWlnaHQgPSBpaDsNCiAgICB9DQogICAgaWYgKHJlbGFmcm9tLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVsYWZyb20ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBpbmRleGlkID0gcmVsYWZyb21baV0uaWQ7DQogICAgICAgICAgICB2YXIgdG9pZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGluZGV4aWQpLmdldEF0dHJpYnV0ZSgnZWQ6dG9pZCcpOw0KICAgICAgICAgICAgaWYgKGV4dHJhUmVsYVtpbmRleGlkXSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgZXh0cmFSZWxhW2luZGV4aWRdID0gew0KICAgICAgICAgICAgICAgICAgICBpZDogaW5kZXhpZCwNCiAgICAgICAgICAgICAgICAgICAgZnJvbWlkOiBpZCwNCiAgICAgICAgICAgICAgICAgICAgdG9pZDogdG9pZCwNCiAgICAgICAgICAgICAgICAgICAgaXNDOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tW2luZGV4aWRdID0ge307DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tLmRpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAocmVsYXRvLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGF0byA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbGF0by5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGluZGV4aWQgPSByZWxhdG9baV0uaWQ7DQogICAgICAgICAgICB2YXIgZnJvbWlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5kZXhpZCkuZ2V0QXR0cmlidXRlKCdlZDpmcm9taWQnKTsNCiAgICAgICAgICAgIGlmIChleHRyYVJlbGFbaW5kZXhpZF0gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtpbmRleGlkXSA9IHsNCiAgICAgICAgICAgICAgICAgICAgaWQ6IGluZGV4aWQsDQogICAgICAgICAgICAgICAgICAgIGZyb21pZDogZnJvbWlkLA0KICAgICAgICAgICAgICAgICAgICB0b2lkOiBpZCwNCiAgICAgICAgICAgICAgICAgICAgaXNDOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGF0b1tpbmRleGlkXSA9IHt9Ow0KICAgICAgICAgICAgb2JqWyJtIiArIGlkXS5yZWxhdG8uZGlzcGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgPyAnYmxvY2snIDogJ25vbmUnOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChjaGlsZHMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uY2hpbGQgPSB7fTsNCiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKSkgew0KICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIgKyBpZCArICInXSIpLmNoaWxkTm9kZXNbMF0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykpOw0KICAgICAgICAgICAgdmFyIHRvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndXNlJylbMF0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykuc2xpY2UoMSk7DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnRvZ3R5cGUgPSB0b2c7DQogICAgICAgIH0NCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaWQgPSBjaGlsZHNbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5jaGlsZCk7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGNhbGxzLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLmNhbGwgPSB7fTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9IGNhbGxzW2ldLmlkOw0KICAgICAgICAgICAgaW5pdChjaWQsIG9ialsibSIgKyBpZF0uY2FsbCk7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGJvdW5kYXJ5Lmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLmJvdW5kYXJ5ID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRhcnkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaWQgPSBib3VuZGFyeVtpXS5pZDsNCiAgICAgICAgICAgIGluaXQoY2lkLCBvYmpbIm0iICsgaWRdLmJvdW5kYXJ5KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoc3VtbWFyeS5sZW5ndGggIT09IDApIHsNCiAgICAgICAgb2JqWyJtIiArIGlkXS5zdW1tYXJ5ID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VtbWFyeS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9IHN1bW1hcnlbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5zdW1tYXJ5KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCi8vLS1pbml0aWFsaXplDQovL3RvZ2dsZWRpc3BsYXktLQ0KdmFyIGNoYWluQXJyID0gW107DQpmdW5jdGlvbiBnZXRjaGFpbihpZCkgew0KICAgIGNoYWluQXJyLnVuc2hpZnQoJ20nICsgaWQpOw0KICAgIHZhciBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuZ2V0QXR0cmlidXRlKCdlZDpwYXJlbnRpZCcpOw0KICAgIGlmICghcGFyZW50KSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgaWYgKHBhcmVudC5tYXRjaCgvXCwvKSkgew0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQubWF0Y2goL1xkKyg/PVwsKS8pWzBdDQogICAgfQ0KICAgIGdldGNoYWluKHBhcmVudCk7DQp9DQpmdW5jdGlvbiBnZXRvYmooaWQpIHsNCiAgICBjaGFpbkFyciA9IFtdOw0KICAgIGdldGNoYWluKGlkKTsNCiAgICB2YXIgbWFpbiA9IGNoYWluQXJyWzBdOw0KICAgIGlmIChjaGFpbkFyci5sZW5ndGggPiAxKSB7DQogICAgICAgIHZhciBvYmogPSBkYXRhVHJlZVttYWluXTsNCiAgICAgICAgLy8gY29uc29sZS5sb2coY2hhaW5BcnIpOw0KICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNoYWluQXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgYSA9IGNoYWluQXJyW2ldOw0KICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgdmFyIGNvYmogPSBvYmpbT2JqZWN0LmtleXMob2JqKVtqXV1bYV07DQogICAgICAgICAgICAgICAgaWYgKGNvYmopIHsNCiAgICAgICAgICAgICAgICAgICAgb2JqID0gY29iajsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iag0KICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBvYmogPSBkYXRhVHJlZVttYWluXTsNCiAgICAgICAgcmV0dXJuIG9iag0KICAgIH0NCg0KfQ0KZm9yICh2YXIgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykgew0KICAgIHNoYXBlW2ldLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBpZCA9IE51bWJlcih0aGlzLmdldEF0dHJpYnV0ZSgnZWQ6dG9ndG9waWNpZCcpKTsNCiAgICAgICAgdmFyIG9iaiA9IGdldG9iaihpZCk7DQoNCiAgICAgICAgdmFyIHR5cGUgPSBvYmoudG9ndHlwZSA9PT0gJ21pbnVzJyA/ICdwbHVzJyA6ICdtaW51cyc7DQogICAgICAgIHZhciBkaXNwbGF5ID0gb2JqLnRvZ3R5cGUgPT09ICdtaW51cycgPyAnbm9uZScgOiAnYmxvY2snOw0KICAgICAgICB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd1c2UnKVswXS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCAnIycgKyB0eXBlKTsNCiAgICAgICAgb2JqLnRvZ3R5cGUgPSB0eXBlOw0KICAgICAgICBjaGVja0lEID0gb2JqOw0KDQogICAgICAgIHV0ZChvYmosIGlkLCBkaXNwbGF5KTsNCiAgICAgICAgZXh0cmFSZWxhRmluKCk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gdXRkKG9iaiwgaWQsIHNob3csIG9jKSB7DQoNCiAgICB2YXIgcHNob3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJzsNCiAgICBpZiAob2JqLnJlbGFmcm9tKSB7DQogICAgICAgIGlmIChvYmoucmVsYWZyb20uZGlzcGxheSAhPT0gcHNob3cpIHsNCiAgICAgICAgICAgIHZhciByZWxhZnJvbXMgPSBPYmplY3Qua2V5cyhvYmoucmVsYWZyb20pOw0KICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLCAxKTsNCiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYWZyb21zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmoucmVsYWZyb20uZGlzcGxheSA9IHBzaG93Ow0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmoucmVsYXRvKSB7DQogICAgICAgIGlmIChvYmoucmVsYXRvLmRpc3BsYXkgIT09IHBzaG93KSB7DQogICAgICAgICAgICB2YXIgcmVsYXRvcyA9IE9iamVjdC5rZXlzKG9iai5yZWxhdG8pOw0KICAgICAgICAgICAgcmVsYXRvcy5zcGxpY2UocmVsYXRvcy5pbmRleE9mKCdkaXNwbGF5JyksIDEpOw0KICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCByZWxhdG9zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhdG9zW2tdOw0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtkXS5pc0MgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb2JqLnJlbGF0by5kaXNwbGF5ID0gcHNob3c7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKG9iai5jYWxsKSB7DQogICAgICAgIHZhciBjYWxscyA9IE9iamVjdC5rZXlzKG9iai5jYWxsKTsNCiAgICAgICAgaWYgKGNoZWNrSUQgIT09IG9iaikgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBhID0gY2FsbHNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGIgPSBvYmouY2FsbFtjYWxsc1tpXV07DQogICAgICAgICAgICAgICAgdmFyIGMgPSBiLnRvZ3R5cGU7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICAgICAgaWYgKGIucmVsYWZyb20gJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGIucmVsYWZyb20uZGlzcGxheSAhPT0gc2hvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcyA9IE9iamVjdC5rZXlzKGIucmVsYWZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYWZyb21zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGF0byAmJiAhYykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYi5yZWxhdG8uZGlzcGxheSAhPT0gc2hvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0b3MgPSBPYmplY3Qua2V5cyhiLnJlbGF0byk7DQogICAgICAgICAgICAgICAgICAgICAgICByZWxhdG9zLnNwbGljZShyZWxhdG9zLmluZGV4T2YoJ2Rpc3BsYXknKSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHJlbGF0b3MubGVuZ3RoOyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHJlbGF0b3Nba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGF0by5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYykgew0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIiArIGEgKyAiJ10iKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICdtaW51cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgoYi5jYWxsIHx8IGIuYm91bmRhcnkgfHwgYi5zdW1tYXJ5KSAmJiBjID09PSAncGx1cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93LCB0cnVlKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLmNhbGwgJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3csIHRydWUpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLnN1bW1hcnkgJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLmJvdW5kYXJ5ICYmICFjKSB7DQogICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmouc3VtbWFyeSkgew0KICAgICAgICB2YXIgc3VtbWFyeXMgPSBPYmplY3Qua2V5cyhvYmouc3VtbWFyeSk7DQogICAgICAgIGlmICgoY2hlY2tJRCAhPT0gb2JqICYmIChvYmoudG9ndHlwZSA9PT0gJ21pbnVzJyB8fCAhb2JqLnRvZ3R5cGUpKSB8fCBjaGVja0lEID09PSBvYmopIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VtbWFyeXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgYSA9IHN1bW1hcnlzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgIHZhciBvc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5nZXRBdHRyaWJ1dGUoJ2VkOnBhcmVudGlkJyk7DQogICAgICAgICAgICAgICAgaWYgKG9zcC5tYXRjaCgvXCwvKSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NwYSA9IG9zcC5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NwTCA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvc3BhLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdyA9PSAnbm9uZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3NwYVtqXSkuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NwTCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zcEwrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3NwTCAhPT0gb3NwYS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBiID0gb2JqLnN1bW1hcnlbc3VtbWFyeXNbaV1dOw0KICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGEpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKGMpew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIithKyInXSIpLnN0eWxlLmRpc3BsYXk9c2hvdzsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYoYz09PSdtaW51cycpew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdykNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBpZiAoYi5jYWxsJiZjPT09J3BsdXMnKSB7DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYoYi5jYWxsJiYhYykgew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhiKS5sZW5ndGggIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmouYm91bmRhcnkpIHsNCiAgICAgICAgdmFyIGJvdW5kYXJ5cyA9IE9iamVjdC5rZXlzKG9iai5ib3VuZGFyeSk7DQogICAgICAgIGlmIChjaGVja0lEICE9PSBvYmopIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRhcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGEgPSBib3VuZGFyeXNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGIgPSBvYmouYm91bmRhcnlbYm91bmRhcnlzW2ldXTsNCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhhKTsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIrYSsiJ10iKS5zdHlsZS5kaXNwbGF5PXNob3c7DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGlmKGM9PT0nbWludXMnKXsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLHNob3cpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2FsbCYmYz09PSdwbHVzJykgew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdyx0cnVlKQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKGIuY2FsbCYmIWMpIHsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdyx0cnVlKQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYikubGVuZ3RoICE9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoIW9jICYmIG9iai5jaGlsZCkgew0KICAgICAgICB2YXIgY2hpbGRzID0gT2JqZWN0LmtleXMob2JqLmNoaWxkKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBhID0gY2hpbGRzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgdmFyIGIgPSBvYmouY2hpbGRbY2hpbGRzW2ldXTsNCiAgICAgICAgICAgIHZhciBjID0gYi50b2d0eXBlOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB2YXIgdFNQYXRoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigicGF0aFtlZFxcOnRvc3VwZXJpZD0nIiArIGEgKyAiJ10iKTsNCiAgICAgICAgICAgIGlmICh0U1BhdGgpIHsNCiAgICAgICAgICAgICAgICB0U1BhdGguc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbm90ZVRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDpub3RldG89JyIgKyBhICsgIiddIik7DQogICAgICAgICAgICBpZiAobm90ZVRpcCkgew0KICAgICAgICAgICAgICAgIG5vdGVUaXAuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5yZWxhZnJvbSAmJiAhYykgew0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGFmcm9tLmRpc3BsYXkgIT09IHNob3cpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcyA9IE9iamVjdC5rZXlzKGIucmVsYWZyb20pOw0KICAgICAgICAgICAgICAgICAgICByZWxhZnJvbXMuc3BsaWNlKHJlbGFmcm9tcy5pbmRleE9mKCdkaXNwbGF5JyksIDEpOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHJlbGFmcm9tcy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYVJlbGFbZF0uaXNDID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChiLnJlbGF0byAmJiAhYykgew0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGF0by5kaXNwbGF5ICE9PSBzaG93KSB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZWxhdG9zID0gT2JqZWN0LmtleXMoYi5yZWxhdG8pOw0KICAgICAgICAgICAgICAgICAgICByZWxhdG9zLnNwbGljZShyZWxhdG9zLmluZGV4T2YoJ2Rpc3BsYXknKSwgMSk7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYXRvcy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhdG9zW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYi5yZWxhdG8uZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIiArIGEgKyAiJ10iKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ21pbnVzJykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYiwgYSwgc2hvdykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKChiLmNhbGwgfHwgYi5ib3VuZGFyeSB8fCBiLnN1bW1hcnkpICYmIGMgPT09ICdwbHVzJykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYiwgYSwgc2hvdywgdHJ1ZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5jYWxsICYmICFjKSB7DQogICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3csIHRydWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5zdW1tYXJ5ICYmICFjKSB7DQogICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5ib3VuZGFyeSAmJiAhYykgew0KICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBleHRyYVJlbGFGaW4oKSB7DQogICAgdmFyIGV4dHJha2V5cyA9IE9iamVjdC5rZXlzKGV4dHJhUmVsYSk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRyYWtleXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgdmFyIGV4dHJhT2JqID0gZXh0cmFSZWxhW2V4dHJha2V5c1tpXV07DQogICAgICAgIGlmIChleHRyYU9iai5pc0MgPT09IHRydWUpIHsNCiAgICAgICAgICAgIHZhciBmc2hvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGV4dHJhT2JqLmZyb21pZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAgICAgdmFyIHRzaG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXh0cmFPYmoudG9pZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXh0cmFPYmouaWQpLnN0eWxlLmRpc3BsYXkgPSBmc2hvdyAmJiB0c2hvdyA/ICdibG9jaycgOiAnbm9uZSc7DQogICAgICAgICAgICBleHRyYVJlbGFbZXh0cmFrZXlzW2ldXS5pc0MgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCn0='))</script>
  </body>
</html>
